我只想问一下我是否可以在方法中为自己分配一个类的实例。
例如,是以下有效的python代码吗?
class O(object):
def __init__(self,value):
self.value = value
def do_something(self):
self = O(1)
这会导致任何意外行为吗?
显然,代码可以运行。但是当我做的时候
A = O(2)
A.do_something()
A.value
输出为2
,我希望它为1
。
答案 0 :(得分:3)
self
只是另一个本地变量。您可以为其分配其他内容,就像您可以为任何变量分配内容一样。首先,self
指向示例中指向的同一个对象A
。
然后执行self = O(1)
时,该语句重新绑定名称self
。它之前引用了O()
的实例,现在您将其指向 O()
的另一个实例。这两个对象在其他方面是独立的,这样做并不会发生任何其他事情。 A
仍引用第一个实例,self
现在引用另一个实例。
因此,将O(2)
分配给self
并不会对self
指向的上一个对象执行任何操作。它肯定不会改变前一个对象的value
属性的值。 A
仍然指向第一个实例,其中value
属性指向整数2
。
你可能想阅读一篇关于Python名称的文章,作者是Ned Batchelder:Facts and myths about Python names and values,它列出了在为Python变量赋值时会发生什么。 self
在这里没什么特别的。
答案 1 :(得分:0)
正如Marcin回答的那样,这是可行的,但这不是一个明智的模式。
你为什么要这样做?如果您希望类的实例在实例化后具有可设置属性,则不应使用构造函数执行此操作。您的提案的简单解决方案:
class O(object):
def __init__(self,value):
self.value = value
def do_something(self):
self.value = 1
根据您的意图,会有其他选择。也许是默认值?
class O(object):
def __init__(self,value):
self.value = value
def do_something(self, value=1):
self.value = value
o = O(2)
// o.value == 2
o.do_something()
// o.value == 1
我认为关键在于:尝试明确而不是智能。您可能会认为您正在寻找的解决方案很聪明,但在您编码时没有任何东西胜过清晰度。
答案 2 :(得分:-1)
self
是一个局部变量。因此,它会使您的代码在该方法中混淆,并且会阻止对原始自身对象的修改(或调用)。