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>}

猜你喜欢

转载自blog.csdn.net/yangjiajia123456/article/details/80785515