代码之家  ›  专栏  ›  技术社区  ›  Dschoni

在python中为自己分配一个类

  •  0
  • Dschoni  · 技术社区  · 10 年前

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

    例如,以下是有效的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 回复  |  直到 10 年前
        1
  •  3
  •   Martijn Pieters    10 年前

    self 是 只是另一个局部变量 你可以给它赋值,就像给任何变量赋值一样。首先, 自己 指向同一对象 A 在你的例子中指出。

    当你执行 self = O(1) ,该声明 重新绑定 名字 自己 .它以前引用了 O() 现在你把它指向 另一个,不同的 实例 O() 这两个对象在其他方面是独立的,这样做不会导致其他任何事情发生。 A. 仍然参考第一实例, 自己 现在引用另一个。

    分配 O(2) 到 自己 不会对上一个对象执行任何操作 自己 指向。它肯定不会改变 value 上一个对象的属性。 A. 仍然指向第一个实例,其中 价值 属性指向整数 2 .

    您可能想阅读Ned Batchelder关于Python名称的文章: Facts and myths about Python names and values ,它展示了当您将某个属性分配给Python变量时发生的情况。 自己 这里没有什么特别的。

        2
  •  0
  •   Caio Tomazelli    10 年前

    正如马辛回答的那样,这是可行的,但不是一个可取的模式。

    你为什么要做这样的事?如果希望类的实例在实例化后具有可设置属性,则不应使用构造函数。您的建议的简单解决方案:

    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
    

    我认为这里的关键是:努力 明确的 而不是 聪明的 .在你看来,你正在寻找的解决方案是聪明的,但没有什么能比得上 清晰 当你编码的时候。

        3
  •  -1
  •   Marcin    10 年前

    self 是局部变量。因此,它将使您的代码在该方法中混淆,并将阻止对原始self对象的修改(或调用)。