python 元类系列 二

本文转载自 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'>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值