这并不是我正在做的任何事情,它只是一些测试代码,因为我只是在学习类方法并且很糟糕。但是假设我有以下代码
class Test(int):
def __init__(self,arg):
self = arg
def thing(self):
self += 10
然后去, foo=Test(12) 将 foo 设置为 12。但是我想要它,所以当我这样做时,foo.thing() , foo 增加 10。到目前为止,继续 foo.thing() 只是将其保持在 12。我该怎么办更改此代码即可做到这一点。
最佳答案
因为int
是不可变的,你不能神奇地将它变成可变类型。
你的方法是无操作的。他们改变self
在本地命名空间中,通过将其重新分配给其他东西。他们不再指向该实例。换句话说,这两种方法都保持原始实例不变。
你不能用 int
的子类做你想做的事。您必须使用numeric type hooks从头开始创建一个自定义类。相反。
背景: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
并将其完全替换为新值。
关于Python 类方法改变自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14671218/