python使用元类验证子类

元类是python比较高级的用法,简而言之,元类就是创建类的类。

而type就是一个元类,是用来创建类对象的类。

因此,要定义元类就要使其继承type类。

通常情况下,开发者在使用OOP的方式编程时,往往会用到__init__方法,即构造函数。该方法会在类初始化时运行。但是我们可以将验证的时机提前,以至于提前到类创建之时,因此就会用到__new__方法。

class Base(type):
    def __new__(cls, name, param, dicts):
        print(cls)
        print(name)
        print(param)
        print(dicts)
        return super().__new__(cls, name, param, dicts)


class Meta(metaclass=Base):
    name = 'yang'

    def person(self):
        pass
Meta()

<class '__main__.Base'>
Meta
()
{'__module__': '__main__', '__qualname__': 'Meta', 'name': 'yang', 'person': <function Meta.person at 0x10c6492f0>}

注意,元类中所编写的验证逻辑,针对的是该基类的子类,而不是基类本身

__new__()方法接收到的参数依次是:

  1. 当前准备创建的类的对象;

  2. 类的名字;

  3. 类继承的父类集合;

  4. 类的方法集合。

class Base(type):
    def __new__(cls, name, bases, attrs):
        # print(cls)
        print(name)
        print(bases)
        print(attrs)
        return super().__new__(cls, name, bases, attrs)


class People:
    pass


class Meta(People, metaclass=Base):
    name = 'yang'

    def person(self):
        return self.name


Meta()

Meta
(<class '__main__.People'>,)
{'__module__': '__main__', '__qualname__': 'Meta', 'name': 'yang', 'person': <function Meta.person at 0x7f0cf38bd840>}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值