本文转载自 https://www.cnblogs.com/zhaoshizi/p/9180886.html
关于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)不太理解,找了些资料,其中一篇博文对元类讲解的比较详细,链接如下:
Python中的元类(译):https://www.cnblogs.com/ajianbeyourself/p/4052084.html
上面的博文比较长,仅就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'>