2009-07-26 6 views
10

Pythonでは、組み込みint型を拡張しようとしています。そうすることで、私は、コンストラクタにいくつかのkeywoard引数に渡したいので、私はこれを行う:C(3)を呼び出すと、正常に動作しながら、しかしPython:__init__のためにintとMROを拡張する

class C(int): 
    def __init__(self, val, **kwargs): 
     super(C, self).__init__(val) 
     # Do something with kwargs here... 

を、C(3, a=4)ができます:

'a' is an invalid keyword argument for this function` 

C.__mro__は予想を返します。

(<class '__main__.C'>, <type 'int'>, <type 'object'>) 

しかし、Pythonが最初int.__init__を呼び出そうとしているようだ...誰もがなぜ知っていますか?これは通訳のバグですか?

答えて

7

__new__を使用してPythonのデータモデル助言のためのドキュメント:

object.new(cls[, ...])

新しい()は(INT、STR、またはタプルのような)不変の種類のサブクラスができるように主に意図されていますインスタンスの作成をカスタマイズします。また、カスタムメタクラスでは、クラス作成をカスタマイズするために一般的にオーバーライドされます。

このような何かが、あなたが与えた例のためにそれを行う必要があります。

class C(int): 

    def __new__(cls, val, **kwargs): 
     inst = super(C, cls).__new__(cls, val) 
     inst.a = kwargs.get('a', 0) 
     return inst 
3

"__new__"を無効にする必要があります."__init__"ではなく、intは変更できません。

関連する問題