python中
所有非object类都继承自object类
所有类的类型包括type类都是type
type类继承自object类,object类的类型也是type类
1. type类
1.1 type构建类
def __init__(self):
self.x = 1000
def show(self):
print(self.x)
XClass = type('X', (object, ), {'a': 100, 'b': 'abc',
'__init__': __init__,
'show': show}) # 类
print(XClass)
# <class '__main__.X'>
print(XClass.__name__) # X
print(XClass.__dict__)
# (<class 'object'>,)
print(XClass.__bases__)
print(XClass.mro())
# [<class '__main__.X'>, <class 'object'>]
print(XClass().x) # 1000
print(XClass().show()) # None
print(type(XClass)) # <class 'type'>
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~~~~~~~~')
"""
~~~~~~~~~~~~~~~~~~
<class '__main__.Meta'>
('A', (), {'__module__': '__main__', '__qualname__': 'A'})
{}
"""
print(type(A)) # <class '__main__.Meta'>
print(A.__bases__) # (<class 'object'>,),没有return语句,直接报错Nonetype
print(A.__dict__)
print('++++++++++++++')
class B(A):
# B的属性也会受元类的影响,元类也可以改变B类的属性
pass
print(type(B), B.__bases__) # 继承时,元类与父类A一样
# <class '__main__.Meta'> (<class '__main__.A'>,)
print(B.__dict__)
# {'__module__': '__main__', 'id': 300, '__doc__': None}
print(B.__name__) # B123
print(A.__bases__) # (<class 'object'>,),没有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类的属性
pass
C = Meta('C', (), {})
print(type(C), C.__bases__)
print(type(A), A.__bases__)
print(type(B), B.__bases__) # 继承时,元类与父类A一样
"""
<class '__main__.Meta'> (<class 'object'>,)
<class '__main__.Meta'> (<class 'object'>,)
<class '__main__.Meta'> (<class '__main__.A'>,)
"""
print('+++++++++++++++++')
class D:
pass
E = type('E', (), {})
print(type(D), D.__bases__)
print(type(E), E.__bases__)
# <class 'type'> (<class 'object'>,)
# <class 'type'> (<class 'object'>,)
print('====================')
class F(Meta): # 注意是继承,F现在也是元类,元类实例化就是在构造新的类
pass
print(type(F), F.__bases__)
# <class 'type'> (<class '__main__.Meta'>,)