2

これは私がまだ取り組んでいるものではありません。クラスメソッドを学んでいるだけなので、テストコードにすぎません。しかし、次のコードがあるとします

class Test(int):
    def __init__(self,arg):
            self = arg

    def thing(self):
            self += 10

そして行くと、foo=Test(12) は foo を 12 に設定します。しかし、私はそれが欲しいので、そうすると foo.thing() は foo を 10 増やします。それを行うには、このコードをどのように変更しますか。

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'>

インプレースのaddメソッドintがないため、は代わりにとして解釈されます。繰り返しになりますが、これを新しい値に割り当てて、完全に新しい値に置き換えます。__iadd__self += 2self = self + 2self

于 2013-02-03T09:53:37.527 に答える