2017-04-27 26 views
2

我想修改一個在類中定義的屬性。對於這個問題,我必須修改屬性的名字,以便在開始時包含private_。所以,如果它以前是self.a,現在是self.private_aself.__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 
+1

建議你執行'__setattr__'並確保'private_'總是前置到屬性的name.'__getattr__'不用於設置屬性。 – Geotob

+0

我應該澄清一點,我已經有一個__setattr__方法。賦值和這個特定問題的要點是能夠使用__getattr__來添加修改其名稱中沒有private_的屬性 – hannahtran

+0

當你說'self.a + = 1'時,Python會*本質上*(不是字面意思)做類似'self .__ setattr __('a',self .__ getattr __('a')+ 1)''的東西。我不確定如何修改'__getattr__'來修改屬性,或者爲什麼有人會希望你這麼做。 – Geotob

回答

1

你的意思是?

class A(object): 

    def __init__(self, a, b, c): 
     self.a = a 
     self.b = b 
     self.c = c 

    def __getattribute__(self, item): 
     if not item.startswith('__'): 
      return object.__getattribute__(self, 'private_' + item) 
     return object.__getattribute__(self, item) 

    def __getitem__(self, item): 
     return object.__getattribute__(self, 'private_' + item) 

    def __setitem__(self, key, value): 
     object.__setattr__(self, 'private_' + key, value) 

    def __setattr__(self, key, value): 
     object.__setattr__(self, 'private_' + key, value) 

結果是:

> a = A(a=1, b=2, c=3) 
> a.__dict__ 
{'private_a': 1, 'private_c': 3, 'private_b': 2} 
>a['a'] 
1 

>a['d']= 1 
>a.__dict__ 
{'private_d': 1, 'private_a': 1, 'private_c': 3, 'private_b': 2} 
>a['d'] += 1 
>a.__dict__ 
{'private_d': 2, 'private_a': 1, 'private_c': 3, 'private_b': 2} 

>a.f = 1 
>a.__dict__ 
{'private_d': 2, 'private_f': 1, 'private_a': 1, 'private_c': 3, 'private_b': 2} 
相關問題