python使用元類驗證子類
阿新 • • 發佈:2018-11-19
元類是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__()
方法接收到的引數依次是:
-
當前準備建立的類的物件;
-
類的名字;
-
類繼承的父類集合;
-
類的方法集合。
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>}