2016-07-16 18 views
1

私はこのようなクラスを持っている:「x + = 5」(xはカスタムクラス)をxのプロパティに追加するにはどうすればよいですか?

class C(object): 
    a = 5 
    def __iadd__(self, other): 
     self.a += other 

私はのような何かを行うことができるようにしたいと思います。同じbの

b = C() 
b += 7 

をまた持っていますが、7でB.A.に追加しかし、実際にこれを実行すると、bがNoneTypeオブジェクトに変わります。これは、C .__ iadd__が何も返さないためだと思います。

C.__ iadd__はself.aを変更してselfのコピーを返さなければなりませんか?オブジェクト全体をコピーして返すことなく、この種の追加を実装する方法はありますか?

+2

"__iadd __()特殊メソッドはインクリメントの値で呼び出され、適切に変更された値を持つ新しいインスタンスを返さなければなりません" https://docs.python.org/3/whatsnew/2.0.html #拡張割り当て – vaultah

答えて

7

あなたは__iadd__メソッドからselfを返すのを忘れ:object.__iadd__() documentationから

def __iadd__(self, other): 
    self.a += other 
    return self 

これらの方法はインプレース操作を行うにしようとする(自己を変更)し、結果を返す必要があります(これは必ずしも可能ではないが、自己)。明示的なreturn文なし

は、機能はとてもb += 7が割り当ての結果であるNoneを生産し、デフォルトとしてNoneを返します。