2
我想修改一個在類中定義的屬性。對於這個問題,我必須修改屬性的名字,以便在開始時包含private_。所以,如果它以前是self.a
,現在是self.private_a
在self.__dict__
。但是,它仍然可以與類中定義的方法一起使用。我使用這種凹凸方法來增加一些屬性,並且當實現getattr
時,更新後的值將被添加到新的鍵上。在Python中使用__getattr__來更新屬性?
例如,如果我的self.dict是
{'private_a': 1, 'private_b': 2, 'c': 3, 'd': 5}
我這樣稱呼顛簸,我得到這個
{'private_a': 1, 'private_b': 2, 'c': 4, 'd': 5, 'a': 2, 'b': 3}
我要的是:
{'private_a': 2, 'private_b': 3, 'c': 4, 'd': 5 }
我是什麼做錯了?
def bump(self):
self.a += 1
self.b += 1
self.c += 1
def __getattr__(self,name):
calling = inspect.stack()[1]
if calling.function in C.__dict__:
actual = 'private_' + name
if actual in self.__dict__:
return self.__dict__[actual]
if name not in self.__dict__:
raise NameError
建議你執行'__setattr__'並確保'private_'總是前置到屬性的name.'__getattr__'不用於設置屬性。 – Geotob
我應該澄清一點,我已經有一個__setattr__方法。賦值和這個特定問題的要點是能夠使用__getattr__來添加修改其名稱中沒有private_的屬性 – hannahtran
當你說'self.a + = 1'時,Python會*本質上*(不是字面意思)做類似'self .__ setattr __('a',self .__ getattr __('a')+ 1)''的東西。我不確定如何修改'__getattr__'來修改屬性,或者爲什麼有人會希望你這麼做。 – Geotob