2 回答

TA貢獻1862條經(jīng)驗 獲得超7個贊
您將所有屬性作為普通值存儲在實例的__dict__. 這意味著,如果沒有任何進一步的提示,它們之間是無法區(qū)分的。
Python 有兩種機制來以特殊方式處理屬性。如果您將在類本身中聲明基類中的屬性,并在__init__方法中初始化它們的值,則可以內(nèi)省基類' __dict__(而不是實例的__dict__)或__annotations__同一類中的屬性。
但是,就像在示例中一樣,一件簡單的事情是使用特殊屬性來記錄添加到基類上的屬性,然后將其作為屬性的名稱來源進行查詢:
class baseclass(object):
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
self._numeric_attrs = set(kwargs.keys())
def calcValue(self):
return sum(getattr(self, attr) for attr in self._numeric_attrs)

TA貢獻1853條經(jīng)驗 獲得超18個贊
一個簡單、安全和有效的——但增加了開銷——將基類屬性存儲在一個不同的屬性中并用于__getattr__為它們提供服務:
class BaseClass(object):
def __init__(self, **kwargs):
self._attribs = kwargs
def __getattr__(self, name):
try:
return self._attribs[name]
except KeyError:
raise AttributeError("object {} has no attribute {}".format(type(self).__name__, name))
def calcValue(self):
return sum(self._attribs.values())
我通常會盡量避免,__getattr__因為它會使代碼更難檢查和維護,但由于您的類已經(jīng)沒有明確的 API,因此在這里沒有太大區(qū)別。
添加回答
舉報