2

这不是我正在做的任何事情,它只是一些测试代码,因为我只是在学习类方法并且很烂。但是说我有以下代码

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。我将如何更改此代码来做到这一点。

4

1 回答 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并用一个新值替换它。

于 2013-02-03T09:53:37.527 回答