在下面的代碼中,我希望元類NameMeta
在屬性沒有聲明該屬性的情況下,將屬性gender
添加到MyName
類。如何攔截類創建並使用元類添加屬性?
class NameMeta(type):
def __new__(cls, name, bases, dic):
if 'gender' not in dic:
setattr(name, 'gender', 'Male')
return super().__new__(cls, name, bases, dic)
class MyName(metaclass=NameMeta):
def __init__(self, fname, lname):
self.fname = fname
self.lname = lname
def fullname(self):
self.full_name = self.fname + self.lname
return self.full_name
inst = MyName('Joseph ', 'Vincent')
print(MyName.gender)
這是我得到的輸出:我知道這個錯誤是有道理的,因爲name
是一個字符串
<ipython-input-111-550ff3cfae41> in __new__(cls, name, bases, dic)
2 def __new__(cls, name, bases, dic):
3 if 'gender' not in dic:
----> 4 setattr(name, 'gender', 'Male')
5 return super().__new__(cls, name, bases, dic)
6
AttributeError: 'str' object has no attribute 'gender'
。 我的問題是,我如何在元類中訪問MyName
類作爲對象,以便我可以添加屬性?
工作。非常感謝您的快速響應。我不得不說,我誠實地認爲,在這種情況下,CLS反映了它在這個案例中的名稱。 –
@ VincentJ.Michuki我已經更新了我的答案。正如Artyer如此友好地指出的那樣,您需要使用:'dic ['gender'] ='Male''。 –
您可以使用'dic.setdefault('gender','Male')'代替「if not present then insert」。可能不會更快,但「更短」。 :) – MSeifert