Python–常用模块脚本–metaclass

#.metaclass

文章目录

# 有两种对象
# 类型(类,新的版本中类和类型是一样的)对象:可以被实例化和继承
# 非类型(实例)对象:不可以被实例和继承

# 元类、类、实例
# type和object
# type为对象的顶点,所有对象都创建自type
# object为类继承的顶点,所有类都继承自object
class Myclass:
    pass
print(Myclass.__class__)  # 类型是type
print(Myclass.__bases__)  # 继承于object
a = 1
print(a.__class__)

# metaclass
# type:造物的上帝
class Myclass1:
    data = 1
# class = type(classname, superclasses, attributedict) 等同
Myclass2 = type('Myclass2', (), {'data': 1})
# 进一步type的__call__运算符重载,开始调用__new__、__init__
# type.__new__(typeclass, classname, superclasses, attributedict)
# type.__init__(class, classname, superclasses, attributedict)
instance1 = Myclass1()
instance2 = Myclass2()
print(instance1, instance2)

# metaclass属性
# metaclass是type的子类,通过替换type的__call__运算符重载机制,“超越变形”正常的类
# class = type(classname, superclasses, attributedict)
# 变为了
# class = MyMeta(classname, superclasses, attributedict)
# 通过元类对子类属性进行操作
class MyMeta(type):
    def __new__(cls, *args, **kwargs):
        print('===>MyMeta.__new__')
        print(cls.__name__)
        return super().__new__(cls, *args, **kwargs)
    def __init__(self, classname, superclasses, attributedict):
        super().__init__(classname, superclasses, attributedict)
        print('===>MyMeta.__init__')
        print(self.__name__)
        print(attributedict)
        print(self.tag)
    def __call__(self, *args, **kwargs):
        print('===>MyMeta.__call__')
        obj = self.__new__(self, *args, **kwargs)
        self.__init__(self, *args, **kwargs)
        return obj
print('#' * 25)
class Foo(object, metaclass=MyMeta):
    tag = '!Foo'
    def __new__(cls, *args, **kwargs):
        print('===>Foo.__new__')
        return super().__new__(cls)
    def __init__(self, name):
        print('===>Foo.__init__')
        self.name = name
print('@' * 25)
foo = Foo('test')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柴寺仓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值