如何在对象中访问私有变量

时间:2012-04-03 09:21:12

标签: python getattr setattr

我想修改一个对象私有变量

class Example():
    __myTest1 = 1
    __myTest2 = 1
    def __init__(self):
        pass
    def modifyTest(self, name = 'Test1', value):
        setattr(self, '__my'+name, value);

我尝试了上面的代码,似乎无法达到私有变量,

AttributeError: Example instance has no attribute '__myTest1'

有没有办法修改私有变量?

3 个答案:

答案 0 :(得分:6)

从外部访问:

e = Example()
e._Example__myTest1   # 1

由于私有变量name mangling rules

但是如果您需要访问私人会员,则表明您的设计存在问题。

如果您需要从班级内部访问或更新它:

class Example():
    __myTest1 = 1
    __myTest2 = 1
    def __init__(self):
        pass

    @classmethod
    def modifyTest(cls, value, name="Test1"):
        setattr(cls, '_%s__my%s' % (cls.__name__, name), value)

必须这样做,因为它是私有类 - 静态变量而不是私有实例变量(在这种情况下它会很简单)

答案 1 :(得分:1)

尝试将单个下划线和类名称添加到变量的开头。

def modifyTest(name = 'Test1', value):
    setattr(self, '_Example__my' + name, value)

答案 2 :(得分:0)

class Example():
    __myTest1 = 1
    __myTest2 = 1
    def __init__(self):
        pass
    def modifyTest(self, name, value):
        setattr(self, '__my'+name, value)

可选变量必须在强制变量之后。