元类
1. 类也是对象
- python中万物皆对象, python运行时候默认加载的模块叫做内嵌的模块。 可以通过globlas()[‘builtin’]来查看
globals()
{‘In’: [’’, ‘globals’, ‘globals()’],
‘Out’: {1: },
‘_’: ,
‘1’: ,
'’: ‘’,
'’: ‘’,
‘builtin’: <module ‘builtins’ (built-in)>,
‘builtins’: <module ‘builtins’ (built-in)>,
‘doc’: ‘Automatically created module for IPython interactive environment’,
‘loader’: None,
‘name’: ‘main’,
‘package’: None,
‘spec’: None,
‘_dh’: [’/home/shuan’],
‘_i’: ‘globals’,
‘_i1’: ‘globals’,
‘_i2’: ‘globals()’,
‘_ih’: [’’, ‘globals’, ‘globals()’],
‘_ii’: ‘’,
‘_iii’: ‘’,
‘_oh’: {1: },
‘_sh’: <module ‘IPython.core.shadowns’ from ‘/usr/lib/python3/dist-packages/IPython/core/shadowns.py’>,
‘exit’: <IPython.core.autocall.ExitAutocall at 0x7fa561850fd0>,
‘get_ipython’: <bound method InteractiveShell.get_ipython of <IPython.terminal.interactiveshell.TerminalInteractiveShell object at 0x7fa5618505f8>>,
‘quit’: <IPython.core.autocall.ExitAutocall at 0x7fa561850fd0>}
当创建一个类的时候:
class AAAAAA():
print("AAAAAA")
globals()
globals()字典中多个键值对:
{‘AAAAAA’: main.AAAAAA,
‘In’: [’’,
‘globals’,
‘globals()’,
…
当创建一个类之后,globals字典中就会多个"AAAAAA"key值,value为指向创建类的空间地址,也就是创建类时候所指向的空间。这也就是说,类就是一个对象。
- 类就是一组用来描述如何生成一个对象的的代码段,类同样也是一种对象,这个对象(类)拥有创建对象(实例对象)的能力。
- 当定义一个函数、类、全局变量时,其实就是创建一个“对象”, 然后用globals获取的这个字典中添加一个名字让这个名字执行刚刚创建的对象空间而已。
2. 元类是特殊的类,type类就是元类,相当于造物主,元类创建类,类创建实例对象。
# 实例属性
class Test1():
num = 100
"""
等价于
Test1 = type("Test1", (), {"num":100})
"""
# 继承
class Test2(Test1):
pass
"""
等价于
Test2 = type("Test2", (Test1,),{})
"""
# 实例方法
class Test3():
num = 10
def test(self):
print("实例方法---")
"""
等价于
Test3 = type("Test3", (), {"num":10, "test":test})
"""
# 类方法
class Test4():
@classmethod
def test_4(cls):
print("这是静态方法----")
"""
等价于
Teset4 = type("Test4", (), {"test_4", test_4})
"""
3. 装饰器可以给函数加功能,元类可以给类加对象。
4. 究竟为什么要使用元类?
元类就是深度的魔法,99%的用户应该根本不必为此操心。如果你想搞清楚究竟是否需要用到元类,那么你就不需要它。那么实际用元类的人都非常清楚的知道他们需要做什么,而且根本不需要解释为什么要用元类。----Python界的领袖Tim Peters