2011-01-05 79 views
1

我不认为这很容易做到,但这里的东西:传递价值分配

假设你有一个简单的类是这样的:

class Demo: 
    a = 'to update' 
    b = a 

正如你所看到的,我想让变量'b'成为变量'a'的另一个名字。所以,我想要做的是这样的:

>>> demo = Demo() 
>>> demo.a 
'to update' 
>>> demo.b 
'to update' 
>>> demo.b = 'updated' 
>>> demo.b 
'updated' 
>>> demo.a 
'updated' 

所以,这是我想实现的一个例子。当我为变量'b'设置一个值时,我想要做的是将一个值设置为变量'a'。我的第一个猜测是将两个变量都设置为对实际值的引用,所以它们指向相同的元素。

任何猜测?以前多谢任何人回答!

PD:该值必须是字符串。

回答

8

你不能挂钩分配来获得你要找的效果。你是对的,你需要将a和b都设置为同一个可变对象,并且将你的赋值改为使对象变异的东西。

class Demo: 
    a = ['to update'] 
    b = a 

>>> demo = Demo() 
>>> demo.a[0] 
'to update' 
>>> demo.b[0] 
'to update' 
>>> demo.b[0] = 'updated' 
>>> demo.b[0] 
'updated' 
>>> demo.a[0] 
'updated' 

你也可以使用属性来达到同样的效果,但A和B是实例的属性,不是阶级属性:

class Demo(object): 
    def __init__(self): 
     self._shared = None 

    @property 
    def a(self): 
     return self._shared 

    @a.setter 
    def a(self, value): 
     self._shared = value 

    @property 
    def b(self): 
     return self._shared 

    @b.setter 
    def b(self, value): 
     self._shared = value 
+0

谢谢!非常聪明! :) – FernandoEscher 2011-01-06 02:25:33

3

这是一个选项。

class Test(object): 

    ab = "Original" 

    def getval(self): 
     return self.ab 

    def setval(self, val): 
     self.ab = val 

    a = property(getval, setval) 
    b = property(getval, setval) 


t = Test() 
print t.a, t.b 
t.a = "Hello" 
print t.a, t.b 

输出,

Original Original 
Hello Hello 
+0

检查出奈德的答案为首选的方式来创建属性 – 2011-01-06 01:19:39