1. 程式人生 > >python使用元類驗證子類

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