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

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

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

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

我知道几乎不会有人想要这样做的情况,但是你不能这样做似乎很奇怪。

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

任何函数的任何参数的任何简单赋值,在Python中的行为都是完全相同的:将该名称绑定到不同的值,并且什么都不做。 “没有什么特别的例子可以打破规则”,就像Python的禅说的那样 – )

所以,远不是那么奇怪(简单地说,在某个特定的函数中指定一个特定的参数并没有任何外部可见的效果),如果这个特定的情况是以任何其他方式工作,那将是非常令人吃惊的 ,仅仅是因为function和争论。

如果你想创build一个类来构造一个不同于它自己的types的对象,这样的行为当然是完全可能的 – 但是它是通过覆盖特殊方法__new__ 而不是 __init__

 class Test(object): def __new__(cls): return 5 t = Test() print t 

确实发出5 。 Python中的__new__ / __init__行为是“两步构造”devise模式的一个例子:“构造函数”本身是__new__ (它构build并返回一个(通常是未初始化的)对象(通常是一个新的types/问题); __init__是正确初始化新对象的“初始化程序”。

例如,这允许构造一旦构build的对象是不可变的:在这种情况下,必须在__new__完成,在构造不可变对象之前,因为如果对象是不可变的, __init__不能为了初始化而对它进行变异它。

它不会“忽略”分配。 分配工作正常,您创build了一个指向数据的本地名称5。

如果你真的想做你正在做的事情…

 class Test(object): def __new__(*args): return 5 

我只是跑了一个快速testing,你可以分配给自己。 在你的init ()方法里面,打印出self的值。 你会看到它是5。

你在这里缺less的是参数是通过Python中的值传递的。 所以,在一个函数或方法中改变一个variables的值不会改变它的外部世界。

所有这些话,我强烈build议不要改变自我。

Egon Spengler博士:那会很糟糕。
Peter Venkman博士:我对整个好/坏的事情都很模糊。 你是什​​么意思,“坏”?
Egon Spengler博士:试着想像所有生命,如你所知,它瞬间停止,你体内的每个分子都以光速爆炸。

有时你想这样做,但不是像int这样的不可变types:

 >>> class Test(list): ... def __init__(self): ... list.__init__(self, [1,2,3]) # self = [1,2,3] seems right, but isn't >> t = Test() >> print t [1, 2, 3] 
 class Test(object): def __init__(self): self = 5 t = Test() print t 

就像有这个PHP(只有其他的郎我知道,对不起)

 class Test { function __construct() { $this = 5; } } 

我不明白这是有道理的。 用值replace实例?