Python 元类和父类的区别及通俗理解

Python元类之难

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

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

通俗理解

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

图示

在这里插入图片描述

图示说明

学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

参考

感谢以下参考文章的作者:

https://blog.csdn.net/Jesszen/article/details/82384217

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值