【问题标题】:python assignment to an object inside itselfpython分配给自身内部的对象
【发布时间】:2014-01-30 18:22:34
【问题描述】:

我正在研究 python 中的一个类,我不知道我是否可以在它的一个方法中分配给一个对象。例如:

class foo:
    def __init__(self):
        self = <something>

那个作业(第 3 行)对吗?

【问题讨论】:

  • 答案是“是的,你可以”。但是,你为什么要这样做?
  • 您希望该作业做什么?
  • 您可以分配给名称self,但这不会“分配给对象”。它不会对物体产生任何影响。
  • 修改self(而不是初始化某些self的args)唯一合理的地方是构造函数,在Python中这不是__init__而是__new__方法。或许,stackoverflow.com/a/674369/1265154这个答案值得一读。

标签: python object variable-assignment self


【解决方案1】:

不,它不会“分配给对象”。基本上,你的代码会做两件事:

  1. 创建一个变量self,它是foo.__init__的本地变量:

    >>> class foo:
    ...     def __init__(self):
    ...         self = 'hi'
    ...         print(self)
    ...
    >>> foo()
    'hi'
    >>>
    
  2. 之后,在类foo 初始化时赋予foo.__init__self 参数将被覆盖。换句话说,在该行之后,您将无法再为foo 创建实例属性:

    >>> class foo:
    ...     def __init__(self):
    ...         self = 'hi'
    ...         print(self)
    ...         self.attr = 'hello'
    ...
    >>> foo()
    hi
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 5, in __init__
    AttributeError: 'str' object has no attribute 'attr'
    >>>
    

总之,你可以做你所描述的,但你真的不应该。它对您的代码没有任何积极作用。相反,它很可能会在以后引起问题。即使没有,它仍然会使阅读您的代码的人感到困惑。


也许通过“分配给对象”,您的意思是要为foo 创建一个实例属性?如果是这样,那么语法将是这样的:

class foo:
    def __init__(self):
        self.<attribute name> = <something>

下面是一个演示:

>>> class foo:
...     def __init__(self):
...         self.my_attribute = 'value'
...
>>> test = foo()
>>> test.my_attribute
'value'
>>>

【讨论】:

    【解决方案2】:

    self 是对对象的引用。如果你分配给它,你会改变变量 self 所指的对象,但它不会修改该方法之外的任何东西。

    功能类似如下代码:

    def change(a):
        a = 10
        print(a) # prints 10
    
    x = 5
    change(x)
    print(x) # prints 5
    

    【讨论】:

      【解决方案3】:

      您可以分配给名称self,但这不会“分配给对象”。它不会对物体产生任何影响。它只是为名为@9​​87654322@ 的局部变量赋值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-21
        • 2013-05-05
        • 2019-11-27
        • 1970-01-01
        • 1970-01-01
        • 2022-12-05
        • 2018-11-12
        相关资源
        最近更新 更多