为什么Python对象中的`self`是不可变的?

Eva*_*ark 25 python object

为什么我不能执行如下操作:

class Test(object):
    def __init__(self):
        self = 5

t = Test()
print t
Run Code Online (Sandbox Code Playgroud)

我希望它打印,5因为我们用它覆盖了实例,但它根本没有做任何事情.甚至不会抛出错误.只是忽略了作业.

我知道几乎没有人愿意这样做的情况,但你不能这样做似乎很奇怪.

更新:我现在明白为什么它不起作用,但我仍然想知道是否有任何方法可以从实例中替换实例.

Ale*_*lli 62

任何简单的分配给任何的参数任何函数的行为确实是在Python以同样的方式:结合该名称不同的值,而没有别的任何责任."正如Python的禅宗所说,没有特殊情况足以打破规则" - )

因此,远非奇怪(简单地说=在特定函数中指定特定参数没有任何外部可见效果),如果这个特定情况以任何其他方式起作用,那将是完全惊人的,仅仅因为它的名称有问题的功能和论点.

如果你想创建一个构造一个不同于自身类型的对象的类,这种行为当然是很有可能的 - 但它是通过覆盖特殊方法获得的__new__,而不是 __init__:

class Test(object):
    def __new__(cls):
        return 5

t = Test()
print t
Run Code Online (Sandbox Code Playgroud)

确实会发出5.Python中的__new__/ __init__behavior是"两步构造"设计模式的一个例子:"构造函数"本身是__new__(它构建并返回一个(通常未初始化的)对象(通常是所讨论的类型/类的新对象); __init__是正确初始化新对象的"初始化程序".

这允许,例如,是不可变对象的构造一旦构造:在这种情况下,一切必须要做__new__给出对象是不可改变的,构造不可变对象之前,因为,__init__以初始化它不能发生变异它.


tru*_*ppo 10

它不会"忽略"任务.赋值工作正常,您创建了一个指向数据的本地名称5.

如果你真的想做你正在做的事......

class Test(object):
    def __new__(*args):
        return 5
Run Code Online (Sandbox Code Playgroud)

  • 确实.但是真正的任务是从实例中替换实例,而这实际上并没有这样做. (2认同)