【问题标题】:Python class methods changing selfPython类方法改变自我
【发布时间】:2013-01-18 05:40:20
【问题描述】:

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

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。我将如何更改此代码以执行此操作。

【问题讨论】:

  • 分配self = arg 对您的新foo 实例没有任何作用(它重新分配self,它不会更新int 子类实例)。请改用__new__ 方法;您可以安全地忽略__init__
  • int 是一个不可变的,你不能神奇地将它变成一个可变的类。

标签: python class methods int self


【解决方案1】:

因为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 并将其完全替换为新值。

【讨论】:

  • 我明白了。所以它只适用于列表之类的东西?所以如果我想要一个修改它的函数,我必须这样调用它吗? foo = foo.dostuff() 并且只让 dostuff 方法返回一个新值
  • @GregHornby: 不,您需要在分配给self属性 或调用方法on 的方法dostuff() 中做一些事情self,不分配给 self 本身。
  • 完全一样;但恐怕int 对象没有这样的属性。
猜你喜欢
  • 1970-01-01
  • 2018-10-12
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-07
  • 1970-01-01
相关资源
最近更新 更多