Python 类方法改变自身

标签 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。我该怎么办更改此代码即可做到这一点。

最佳答案

因为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/

相关文章:

python - 停止 Floodfill 算法

python - Serverless TypeError : chalk(. ..).dim 不是函数

c++ - 将两个不同的类(具有相同的继承基类)存储在同一个 vector 中? (无提升)

java - 覆盖和重载的方法

c# - 从另一种方法(Quartz.NET)获取调度程序。或者一般方法问题

Python urlparse 给出错误的结果

python - 私有(private)变量和类局部引用

java - Java 中的未知代码

string - 为什么我不能将 ToUpper() 应用于 OwnerNode?

python - 调整引用另一个数组的numpy数组的大小