元类
注意:实例方法、类方法和静态方法都是保存在类的__dict__中的
简单来说,元类就是创建对象的类
可以通过__class__来查看实例对象的类以及类对象的类,请看下面代码
num = 10
print(num.__class__)
s = 'abc'
print(s.__class__)
class Person(object):
pass
p = Person()
print(p.__class__)
print('-' * 20)
print(int.__class__)
# print(num.__class__.__class__)
print(str.__class__)
print(Person.__class__)
输出结果:
<class 'int'>
<class 'str'>
<class '__main__.Person'>
--------------------
<class 'type'>
<class 'type'>
<class 'type'>
反映在内存中可以这样表示:见下图
元类(type)上面就没有类了
创建类的方式
创建方式
- 通过class 定义
当我们这么写这个类描述的时候, 解释器会自动的帮我们
创建对应的类对象 - 通过type函数进行创建
# type函数进行创建类
def run(self):
print('----', self)
# xxx 是一个存储类的地址的变量, Dog是类名
xxx = type('Dog', (), {'count': 0, 'run': run})
print(xxx)
print(xxx.__dict__)
d = xxx()
print(d)
d.run()
输出结果:
<class '__main__.Dog'>
{'count': 0, 'run': <function run at 0x000001CB68F8C1E0>, '__module__': '__main__', '__dict__': <attribute '__dict__' of 'Dog' objects>, '__weakref__': <attribute '__weakref__' of 'Dog' objects>, '__doc__': None}
<__main__.Dog object at 0x000001CB69134240>
---- <__main__.Dog object at 0x000001CB69134240>
类的创建流程
- 检测类中是否有明确 __metaclass__属性 有, 则通过指定元类来创建这个类对象
- 检测父类中是否存在__metaclass__属性 有, 则通过指定元类来创建这个类对象
- 检测模块中是否存在__metaclass__属性 有, 则通过指定元类来创建这个类对象
- 通过内置的type这个元类,来创建这个类对象