python对自身内部对象的赋值

python对自身内部对象的赋值,python,object,variable-assignment,self,Python,Object,Variable Assignment,Self,我正在用python编写一个类,我不知道是否可以在它的一个方法中为对象赋值。例如: class foo: def __init__(self): self = <something> foo类: 定义初始化(自): 自我= 分配(第3行)正确吗?您可以分配给名称self,但不能“分配给对象”。它不会对对象产生任何影响。它只是给一个名为self的局部变量赋值,您可以给名称self赋值,但这并不“赋值给对象”。它不会对对象产生任何影响。它只是给一个名为self

我正在用python编写一个类,我不知道是否可以在它的一个方法中为对象赋值。例如:

class foo:
    def __init__(self):
        self = <something>
foo类:
定义初始化(自):
自我=

分配(第3行)正确吗?

您可以分配给名称
self
,但不能“分配给对象”。它不会对对象产生任何影响。它只是给一个名为
self
的局部变量赋值,您可以给名称
self
赋值,但这并不“赋值给对象”。它不会对对象产生任何影响。它只是给一个名为
self

self
的局部变量赋值,它是对对象的引用。如果指定给它,则会更改变量self引用的对象,但它不会修改该方法之外的任何内容

该功能类似于以下代码:

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

x = 5
change(x)
print(x) # prints 5

self
是对对象的引用。如果指定给它,则会更改变量self引用的对象,但它不会修改该方法之外的任何内容

该功能类似于以下代码:

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

x = 5
change(x)
print(x) # prints 5
否,它不会“指定给对象”。基本上,您的代码将做两件事:

  • 创建一个变量
    self
    ,该变量是
    foo的本地变量

    >>> class foo:
    ...     def __init__(self):
    ...         self = 'hi'
    ...         print(self)
    ...
    >>> foo()
    'hi'
    >>>
    
  • 之后,在类
    foo
    初始化时提供给
    foo.\uuuu init\uuuu
    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'
    >>>
    
    下面是一个演示:

    >>> class foo:
    ...     def __init__(self):
    ...         self.my_attribute = 'value'
    ...
    >>> test = foo()
    >>> test.my_attribute
    'value'
    >>>
    
    否,它不会“指定给对象”。基本上,您的代码将做两件事:

  • 创建一个变量
    self
    ,该变量是
    foo的本地变量

    >>> class foo:
    ...     def __init__(self):
    ...         self = 'hi'
    ...         print(self)
    ...
    >>> foo()
    'hi'
    >>>
    
  • 之后,在类
    foo
    初始化时提供给
    foo.\uuuu init\uuuu
    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'
    >>>
    
    下面是一个演示:

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

    答案是“是的,你可以”。但是,您为什么要这样做?您希望该赋值做什么?您可以将其赋值给名称
    self
    ,但这并不“赋值给对象”。它不会对对象产生任何影响。修改self(而不是初始化某些self的参数)的唯一合理位置是构造函数,在Python中,这不是
    \uuuuuu init\uuuuuu
    方法,而是
    \uuu new\uuuu
    方法。也许,这个答案值得一读。答案是“是的,你可以”。但是,您为什么要这样做?您希望该赋值做什么?您可以将其赋值给名称
    self
    ,但这并不“赋值给对象”。它不会对对象产生任何影响。修改self(而不是初始化某些self的参数)的唯一合理位置是构造函数,在Python中,这不是
    \uuuuuu init\uuuuuu
    方法,而是
    \uuu new\uuuu
    方法。也许,这个答案值得一读。