我有以下情况:
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 ++,但这就是我想要的。
答案 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."只需要依赖约定(如果你想警告用户不要修改它,并使用_
前缀来调用名称修改以避免超类中的冲突),请使用__
作为变量的前缀。3}} p>