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