使用metaclass驗證子類

2021-08-09 15:45:05 字數 1199 閱讀 2217

# coding: utf-8

# python2中定義metaclass, 該metaclass要繼承自type, 實現__new__方法

class

metacls

(type):

def__new__

(meta, name, bases, class_dict):

print (meta, name, bases, class_dict)

if class_dict['val'] < 0:

raise valueerror('error: val[%s] < 0!!!' % class_dict['val'])

return type.__new__(meta, name, bases, class_dict)

# 使用者要通過__metaclass__變數指定要使用的metaclass

# metaclass中所編寫的驗證邏輯, 針對的是該基類的子類, 而非基類本身

class

basecls

(object):

__metaclass__ = metacls

val = none

# 驗證成功

class

derived1cls

(basecls):

val = 1

# 驗證失敗

class

derived2cls

(basecls):

val = -2

python main.py
# ('__main__.metacls'>, 'basecls', ('object'>,), )

# traceback (most recent call last):

# file

"main.py", line 11, in # class basecls(object):

# file

"main.py", line 7, in __new__

# raise valueerror('error: val[%s] < 0!!!' % class_dict['val'])

# valueerror: error: val[none] < 0!!!

《effective python》第33條, 用元類來驗證子類

python使用元類驗證子類

元類是python比較高階的用法,簡而言之,元類就是建立類的類。而type就是乙個元類,是用來建立類物件的類。因此,要定義元類就要使其繼承type類。通常情況下,開發者在使用oop的方式程式設計時,往往會用到 init 方法,即建構函式。該方法會在類初始化時執行。但是我們可以將驗證的時機提前,以至於...

python當中的metaclass使用

type class name,base class,attrs example newclass type newcls a newclass a.name 我們用type成功生成了乙個類,他的意義在於,我可以在程式執行的過程中,使用 動態的去定義乙個類 區別於那種傳統的先用class定義完你用的...

子類建構函式中呼叫虛函式問題驗證

一 問題 大家是否有在子類或基類建構函式中呼叫虛函式的情況呢?語法是否支援?執 況如何呢?為什麼呢?二 問題驗證 這個問題的最好答案是親自寫個demo除錯下看看結果如何,下面是demo vs2019 1 class base 7virtual void func 10 1112 class d pu...