gpt4 book ai didi

python - 在 python 中,self 并不意味着实例?

转载 作者:太空宇宙 更新时间:2023-11-04 10:52:29 25 4
gpt4 key购买 nike

我只是做了一个 foo 类来解释我的意思:

class Foo:
def __init__(self, fakevalue):
self.fv = fakevalue

@staticmethod
def make_a_foo():
return Foo(2)

def try_change_foo_value(self):
self = Foo.make_a_foo()
print "in change function, self.fv:", self.fv

if(__name__ =='__main__'):
foo_instance = Foo(1)
print "foo_instance.fv:", foo_instance.fv
foo_instance.try_change_foo_value()
print "foo_instance.fv:", foo_instance.fv

我希望:

foo_instance.fv: 1
in change function, self.fv: 2
foo_instance.fv: 2

但结果是:

foo_instance.fv: 1
in change function, self.fv: 2
foo_instance.fv: 1

我们可以看到 self 值已经改变,但实例值没有。为什么?以及如何解决这个问题?

最佳答案

在这种情况下,self 是指向调用者实例的指针。尽管您更改了 try_change_foo_value 中的指针,但这就像更改函数中的参数一样:它在方法之外没有任何影响。

为了澄清这一点,您可以考虑

a.try_change_foo_value() 作为 Foo.try_change_foo_value(a) 的简写。这应该很明显,当您更改 self 时,您正在更改 local 变量,而调用者 a 保持不变。

要修复它,你应该做

def try_change_foo_value(self):
self.fv = 2

但正如 mgilson 指出的那样,只说 foo_instance.fv = 2 更符合 Pythonic。

如果你想真正改变 foo_instance 的值(而不仅仅是 fv),你应该在别处做,而不是在方法中(这在概念上没有意义) ).

关于python - 在 python 中,self 并不意味着实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12810911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com