Python 元类和父类的通俗理解
- Python元类之难
- 通俗理解
- 图示
- 图示说明
- 从代码层面理解(一定要看注释说明,帮助理解)
Python元类之难
- Python的元类可以说是Python中最难理解的知识点,一开始看了各种文章,还是理解不好。
- 容易与类的继承(父类)混淆。
- 稍微有点编程基础的人,相信都对父类有所理解,但是究竟什么是元类,为什么要用元类,有什么好处,有了父类为什么还要元类干嘛。
下面我是个人的一些通俗理解,如果有不对的地点,请指正。
通俗理解
相信大家都有去五金店打过钥匙的经历,我们要参照原来的钥匙(模具),再打造一把新的钥匙。这里所说的模具,即是父类,而打出来的新钥匙即是子类,我们可以在新钥匙(子类)上加一些装饰品,即子类自定属性或方法。那么在这里,什么是元类呢???那部打造钥匙的机器就是元类。下面通过图示可能会比较好理解
图示
图示说明
学python都知道,我们平常所用的类其实是用type创建出来的。而元类继承自type类,这意味着,它跟type一样,是用来创建类的,可以理解为两者是同一个级别,只是元类可以在创建类的时候都再干一些自定义的活
从代码层面理解(一定要看注释说明,帮助理解)
class TestMetaClass(type):
def __new__(cls, name, bases, attrs): # 这里重写type类的__new__方法,实现自定义
count = 0
list_skiless = attrs.setdefault('__skiless__', []) # 为类再创建新内置属性
for k, v in attrs.items():
if 'acc' in k:
list_skiless.append(k)
count += 1
attrs['__a_count__'] = count
print(f'name:{name}') # 输出name:TestClass
print(f'bases:{bases}') # 输出bases:(<class 'object'>,),即父类
print(f'attrs:{attrs}') # 输出类的属性字典
return type.__new__(cls, name, bases, attrs) # 一定要返回,创建出类
class TestClass(object, metaclass=TestMetaClass):
# 这里等价于:TestClass=TestMetaClass('TestClass',object,{'get':get,'acc':acc,'acc2':acc2})
# 这里metaclass=TestMetaClass,也可以metaclass=type
# 当metaclass=type时,等价于class TestClass(object),即我们平常所用的定义类的方式
def __init__(self):
print('init')
def get(self):
print('get')
def acc(self):
pass
def acc2(self):
pass