python 3:类函数成员修改类数据成员

时间:2012-11-14 19:43:35

标签: python python-3.x

  

可能重复:
  Python: How do I pass a variable by reference?

我有以下情况:

class A:
    def __init__(self):
        self.test = ''
        self.func(self.test)
        print(self.test)
    def func(self,var):
        var = 'foo'

我希望func修改self.var,我希望能够通过自我。这个方法。

有点像:

class A()
{
  public:
    char test[256];
    A() { func(test);}
  private:
    void func(char * var) { var = "foo"; }
};

我有一段时间没有写过C ++,但这就是我想要的。

1 个答案:

答案 0 :(得分:0)

不幸的是,我不太了解C++,但我猜你想要这样的事情:

class A:
    def __init__(self):
        self.test = ''
        self.func("test")
        print(self.test)
    def func(self,var):
        setattr(self,var,'foo')

我们必须这样做,因为我们可以在函数内部改变(mutate)self.test(如果它是可变的),但是我们不能改变它引用的对象(这是你试图的那个)做任务)。考虑:

def func1(x):
   x.append('foo')
def func2(x):
   x = 'foo'

a = []
func1(a)
print a #['foo']  #mutated a in func1
func2(a)
print a #['foo']  #didn't change a in func2, only created a new local variable named `x` and assigned it to the string 'foo'

解决此问题的唯一方法是传递某种类似代理的对象,您可以更改它。在这种情况下,我们将实例作为代理对象(self)和属性的名称(var)传递,以便我们知道在self上要更改的内容。鉴于这两条信息,我们可以进行所需的更改 - 当然,在这一点上,您可能最好一起摆脱func并直接使用setattr


可能还值得问你为什么要这样做。一般来说,你可以这样做:

self.test = "foo"

你为什么要写:

self.func(self.test)

代替?我可以理解,如果您正在尝试这样做,因为您已经习惯了私有方法和属性。但这是python。 "We're all consenting adults here."只需要依赖约定(如果你想警告用户不要修改它,并使用_前缀来调用名称修改以避免超类中的冲突),请使用__作为变量的前缀。