2012-04-03 78 views
3

我想修改对象的私有变量我怎么能在对象中达到一个私有变量

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' 

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

+2

那些不是私有变量。他们只是名字被打乱了。做**不**使用他们的隐私,这是一个单一的下划线是什么。 – delnan 2012-04-03 09:35:38

+0

您在modifyTest中忘记了自己。 def modifyTest(self,name ='Test1',value) – 2012-04-03 09:38:04

+0

谢谢,我编辑了 – 2012-04-03 09:40:49

回答

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) 

必须这样做,因为它是一个私有类,静态变量,而不是一个私有的实例变量(在这种情况下,它会直截了当)

+0

我想在课堂内部进行访问,而不是从外部访问 – 2012-04-03 09:30:38

+0

@iUngi更新了内部访问 – 2012-04-03 09:38:41

+0

@iUngi如果你正在编写这个类,你做错了。在Python中,99.99%的时间,名称损坏的属性是一个可怕的想法。你为什么在这里使用它们?如果您只想要与您班级的内部功能相关的内容,请使用单个下划线。 – 2012-04-03 10:05:26

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

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

+0

更新....... – 2012-04-03 09:43:49

1

尝试在变量的开头添加一个下划线和类名。

def modifyTest(name = 'Test1', value): 
    setattr(self, '_Example__my' + name, value) 
相关问题