Python 类方法更改 self
这段话是说,作者现在还没有在做什么具体的项目,只是在学习类的方法,感觉自己还不太行。他写了一些测试代码,代码如下:
class Test(int):
def __init__(self,arg):
self = arg
def thing(self):
self += 10
然后,他创建了一个叫做foo的对象,并把它的值设为12。但是他希望,当他调用foo.thing()的时候,foo的值能增加10。目前为止,调用foo.thing()后,foo的值还是保持在12。他想知道应该怎么改这段代码才能实现这个功能。
1 个回答
4
因为 int
是不可变的,所以你不能神奇地把它变成可变的类型。
你的方法其实没有做任何事情。它们在本地的命名空间中改变了 self
,把它重新指向了其他东西。这样一来,它们就不再指向原来的实例了。换句话说,这两个方法都没有改变原来的实例。
你想做的事情不能通过 int
的子类来实现。你需要从头开始创建一个自定义的类,使用 数字类型的钩子。
背景知识:int
有一个 __new__
方法,它负责把实际的值赋给 self
,而没有 __iadd__
方法来支持原地加法。__init__
方法并不是被忽略的,但你可以完全不写它,因为 __new__
已经完成了这个工作。
给 self
赋值意味着你只是把对实例的引用替换成了其他东西,并没有真正 改变 self
的任何内容:
>>> class Foo(int):
... def __init__(self, value=0):
... print self, type(self)
... self = 'foobar'
... print type(self)
...
>>> foo = Foo(10)
10 <class '__main__.Foo'>
<type 'str'>
>>> print foo, type(foo)
10 <class '__main__.Foo'>
因为 int
没有 __iadd__
这个原地加法的方法,所以你的 self += 2
实际上被解释为 self = self + 2
;同样,你是在给 self
赋值,把它替换成了一个全新的值。