Python 类方法更改 self

2 投票
1 回答
6379 浏览
提问于 2025-04-17 14:35

这段话是说,作者现在还没有在做什么具体的项目,只是在学习类的方法,感觉自己还不太行。他写了一些测试代码,代码如下:

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 赋值,把它替换成了一个全新的值。

撰写回答