不幸的是,我不太C++
清楚,但我猜你想要这样的东西:
class A:
def __init__(self):
self.test = ''
self.func("test")
print(self.test)
def func(self,var):
setattr(self,var,'foo')
我们必须这样做,因为我们可以self.test
在函数内部更改(mutate)(如果它是可变的),但我们不能更改它引用的对象(这是您试图通过赋值执行的操作)。考虑:
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)
反而?我可以理解您是否尝试这样做,因为您习惯于使用私有方法和属性。但这是蟒蛇。 “我们都是同意这里的成年人。” 只需依赖约定(_
如果要警告用户不要修改变量,请在变量前面加上前缀,并__
在调用名称修改以避免超类中的冲突时加上前缀)。