改变自我的Python类方法

时间:2013-02-03 09:47:06

标签: python class methods int self

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

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.我将如何更改此代码即可。

1 个答案:

答案 0 :(得分:4)

因为int是不可变的,所以你不能神奇地把它变成一个可变的类型。

你的方法是无操作的。他们通过将其重新分配给其他名称来更改本地名称空间中的self。他们不再指向实例。换句话说,两种方法都保留原始实例 unaltered

你无法用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并将其替换为新值。