创造新类和改变类行为

type 创造类

正常情况下通过class创造类。

class MyClz(object):
    pass

使用高级魔法type动态创建类,类也是对象,是type类的实例对象

name, bases, attrs = "new", (int,), {}

# 函数创建
new_class = type(name, bases, attrs)

# 类创建,可以不写__init__方法
class MyMeta(type):
    def __new__(cls, name, bases, dit):
        return super(MyMeta, cls).__new__(cls, name, bases, dit)

new_class = MyMeta(name, bases, attrs)

print(type(new_class))  # <class '__main__.MyMeta'>
# 因为新类是继承于type,type的父类是object,所以新类的父类是object
print(new_class.__bases__)  # (<type 'object'>,) 

print("x"*20)

metaclass 改变类和被实例化对象的行为

以上动态的创造了新的类,如果需要统一改变类的所有实例的,使用元类则可以实现

# 例如统一增加一个name的属性
class MyMeta(type):
    def __new__(cls, name, bases, dit):
        dit["name"] = "from metaclass"
        return super(MyMeta, cls).__new__(cls, name, bases, dit)

class ABC(object):
    __metaclass__ = MyMeta

abc = ABC()
print(type(abc))  # <class '__main__.MyMeta'>
# 因为ABC继承于object,object是超类,所以都没有父类
print(abc.__bases__) # AttributeError: 'ABC' object has no attribute '__bases__'  
print(abc.name)  # from metaclass

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值