2011-06-24 14 views
5

SWIGの-builtinオプションは、より速く、多重継承のバグを免除されるという利点があります。
後退は私が生成されたクラスまたはサブクラスに任意の属性を設定することはできませんです。
-Iは、それをサブクラス化することで、手間をかけずに、リストのようなPythonの組み込みタイプを拡張することができますSWIG組み込みクラスの拡張

class Thing(list): 
    pass 

Thing.myattr = 'anything' # No problem 

使用-However SWIG組み込みタイプの同じアプローチでは、次のようになります。

class Thing(SWIGBuiltinClass): 
    pass 

Thing.myattr = 'anything' 

AttributeError: type object 'Thing' has no attribute 'myattr' 

この問題を回避するにはどうすればよいですか?

+0

を私はこの問題に対するMONKのソリューションは完全に適切であることを指摘しなければならないと思うが、それはおそらく最初の場所で '-builtin'を使用して、すべての利益を否定します。もちろん、私の場合、私はサブクラス化しないスピードを必要とするクラスを1つ持っています。しかし、私はサブクラス化する別のクラスも持っています。それは本当に便利なテクニックです。 – Mike

答えて

3

偶然、解決策が見つかりました。私はメタクラスを試していましたが、setattrgetattrのサブクラスの組み込み型関数をオーバーライドできると考えていました。

これを行うと、私は組み込みのものが既にメタクラス(SwigPyObjectType)を持っていることを知ったので、私のメタクラスはそれを継承しなければなりませんでした。

それだけです。これだけで問題は解決しました。誰かが理由を説明することができれば、私は喜んでいるだろう:

SwigPyObjectType = type(SWIGBuiltinClass) 

class Meta(SwigPyObjectType): 
    pass 

class Thing(SWIGBuiltinClass): 
    __metaclass__ = Meta 

Thing.myattr = 'anything' # Works fine this time 
関連する問題