我正在尝试修改类中定义的属性。对于这个问题,我必须修改属性的名称,以便在开头包含private_。因此,如果它之前为self.a
,则self.private_a
中的self.__dict__
现在为getattr
。但是,它仍然可以使用类中定义的方法。我有这个bump方法增加了一些属性,并且当实现{'private_a': 1, 'private_b': 2, 'c': 3, 'd': 5}
时,更新的值被添加到新的键中。
例如,如果我的self.dict是
{'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}}
答案 0 :(得分: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}