zoukankan      html  css  js  c++  java
  • 关于six.with_metaclass(ABCMeta, object)的理解

    在学习Python过程中,看到了生成虚基类的方式,
    class PeopleBase(six.with_metaclass(ABCMeta, object)):
        @abstractmethod
        def work(self, *args, **kwargs):
            #pass为空语句,占位用
            pass
    
        @abstractmethod
        def live(self, *args, **kwargs):
            pass
    对于six.with_metaclass(ABCMeta, object)不太理解,找了些资料,其中一篇博文对元类讲解的比较详细,链接如下:
     
    上面的博文比较长,仅就six.with_metaclass(ABCMeta, object)相关的内容,做一点笔记
     
    元类就是创建类的类,在Python中,只有type类及其子类才可以当元类,
    type创建类时,参数格式:type(classname, parentclasses , attrs),classname是类名,字符串类型,parentclasses是类的所有父类,元组类型,attrs是类的所有{属性:值},是字典类型
    一切类的创建最终都会调用type.__new__(cls, classname, bases, attrs),它会在堆中创建一个类对象,并返回该对象
    当通过type.__new__(cls, classname, bases, attrs)创建类时,cls就是该类的元类,它是type类或其子类。
     
    ABCMeta是一个抽象类的元类,用来创建抽象类基类:Metaclass for defining Abstract Base Classes (ABCs).
    six.with_metaclass是用元类来创建类的方法,调用一个内部类,在内部类的__new__函数中,返回一个新创建的临时类
    def with_metaclass(meta, *bases):
        """Create a base class with a metaclass."""
        # This requires a bit of explanation: the basic idea is to make a dummy
        # metaclass for one level of class instantiation that replaces itself with
        # the actual metaclass.
        class metaclass(type):
    
            def __new__(cls, name, this_bases, d):
                return meta(name, bases, d)
    
            @classmethod
            def __prepare__(cls, name, this_bases):
                return meta.__prepare__(name, bases)
        return type.__new__(metaclass, 'temporary_class', (), {})
    six.with_metaclass(ABCMeta, object)就通过内部类的__new__函数返回一个ABCMeta元类创建的临时类,作为PeopleBase类的基类
    在python里类也是对象,下面两个语句可以看PeopleBase类的类型,都是<class 'abc.ABCMeta'>,即PeopleBase类是ABCMeta元类的对象,是由ABCMeta元类生成的。
    print(type(PeopleBase))
    print(PeopleBase.__class__)
    #<class 'abc.ABCMeta'>
    #<class 'abc.ABCMeta'>
  • 相关阅读:
    [C++]仿java.lang.String的字符串工具类[原]
    SQL基础1创建表、用户
    Linux中gdb 查看core堆栈信息
    Direct3D9基础工具类[原]
    eclipse3.4启动错误
    ndk连接第三方库
    数据库基本概念
    MySQL常见命令
    MySQL启动和停止
    MySQL配置文件
  • 原文地址:https://www.cnblogs.com/zhaoshizi/p/9180886.html
Copyright © 2011-2022 走看看