Python 元类和父类的通俗理解

  • Python元类之难
  • 通俗理解
  • 图示
  • 图示说明
  • 从代码层面理解(一定要看注释说明,帮助理解)

Python元类之难

  1. Python的元类可以说是Python中最难理解的知识点,一开始看了各种文章,还是理解不好。
  2. 容易与类的继承(父类)混淆。
  3. 稍微有点编程基础的人,相信都对父类有所理解,但是究竟什么是元类,为什么要用元类,有什么好处,有了父类为什么还要元类干嘛。

下面我是个人的一些通俗理解,如果有不对的地点,请指正。

通俗理解

相信大家都有去五金店打过钥匙的经历,我们要参照原来的钥匙(模具),再打造一把新的钥匙。这里所说的模具,即是父类,而打出来的新钥匙即是子类,我们可以在新钥匙(子类)上加一些装饰品,即子类自定属性或方法。那么在这里,什么是元类呢???那部打造钥匙的机器就是元类。下面通过图示可能会比较好理解

图示

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