本文共 2550 字,大约阅读时间需要 8 分钟。
python中
所有非object类都继承自object类
所有类的类型包括type类都是type
type类继承自object类,object类的类型也是type类
def __init__(self): self.x = 1000def show(self): print(self.x)XClass = type('X', (object, ), {'a': 100, 'b': 'abc', '__init__': __init__, 'show': show}) # 类print(XClass)#print(XClass.__name__) # Xprint(XClass.__dict__)# ( ,)print(XClass.__bases__)print(XClass.mro())# [ , ]print(XClass().x) # 1000print(XClass().show()) # Noneprint(type(XClass)) #
class Meta(type): # 现在的new方法跟以前不同了 def __new__(mcs, name, bases, attr: dict): print(mcs) print(name) print(bases) print(attr) attr['id'] = 300 # 会改变类A中自己定义的id print() return super().__new__(mcs, name + '123', bases, attr) # 什么都可以改变print("~~~~~~~~~~~~~~~~~~")# 元类是创造类的类class A(metaclass=Meta): # 修改了元类,并没有改变继承列表 # A的名字可以被元类改变,不仅如此,A的所有属性都可以被元类修改 id = 2000 def __init__(self): print('A.init~~~~~~~~')"""~~~~~~~~~~~~~~~~~~('A', (), {'__module__': '__main__', '__qualname__': 'A'}){}"""print(type(A)) # print(A.__bases__) # ( ,),没有return语句,直接报错Nonetypeprint(A.__dict__)print('++++++++++++++')class B(A): # B的属性也会受元类的影响,元类也可以改变B类的属性 passprint(type(B), B.__bases__) # 继承时,元类与父类A一样# ( ,)print(B.__dict__)# {'__module__': '__main__', 'id': 300, '__doc__': None}print(B.__name__) # B123print(A.__bases__) # ( ,),没有return语句,直接报错Nonetype
class Meta(type): # 现在的new方法跟以前不同了 def __new__(mcs, name, bases, attr: dict): print(mcs) print(name) print(bases) print(attr) attr['id'] = 300 # 会改变类A中自己定义的id print() return super().__new__(mcs, name, bases, attr) # 什么都可以改变print("~~~~~~~~~~~~~~~~~~")# 元类是创造类的类class A(metaclass=Meta): # 修改了元类,并没有改变继承列表 # A的名字可以被元类改变,不仅如此,A的所有属性都可以被元类修改 id = 2000 def __init__(self): print('A.init~~~~~~~~')class B(A): # B的属性也会受元类的影响,元类也可以改变B类的属性 passC = Meta('C', (), {})print(type(C), C.__bases__)print(type(A), A.__bases__)print(type(B), B.__bases__) # 继承时,元类与父类A一样"""( ,) ( ,) ( ,)"""print('+++++++++++++++++')class D: passE = type('E', (), {})print(type(D), D.__bases__)print(type(E), E.__bases__)# ( ,)# ( ,)print('====================')class F(Meta): # 注意是继承,F现在也是元类,元类实例化就是在构造新的类 passprint(type(F), F.__bases__)# ( ,)
转载地址:http://wvfvi.baihongyu.com/