在Python中使用__getattr__来更新属性?

时间:2017-04-27 02:12:23

标签: python class getattr

我正在尝试修改类中定义的属性。对于这个问题,我必须修改属性的名称,以便在开头包含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}}

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}