在python中为自己分配一个类

时间:2016-10-10 16:03:48

标签: python class oop

我只想问一下我是否可以在方法中为自己分配一个类的实例。

例如,是以下有效的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

3 个答案:

答案 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是一个局部变量。因此,它会使您的代码在该方法中混淆,并且会阻止对原始自身对象的修改(或调用)。