2011-06-24 38 views
5

SWIG的-builtin選項具有速度更快的優點,並且可以免除多繼承錯誤。
挫折是我無法設置在生成的類或任何亞類的任何屬性:
-I可以擴展蟒內建類型像列表中,沒有麻煩,通過繼承它:擴展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

我想應該指出的是,和尚的解決這個問題是完全足夠的,但它可能是否定首先使用'-builtin'的所有好處。當然,就我而言,我有一個班級需要速度,我不會繼承;但我也有另一類我做的子類。所以這是一個非常有用的技術。 – Mike

回答

3

我發現了一個非常偶然的解決方案。我正在嘗試元類,認爲我可以設法覆蓋子類中的內建類型的功能setattrgetattr函數。

這樣做我發現builtins已經有一個元類(SwigPyObjectType),所以我的元類必須繼承它。

就是這樣。這就解決了這個問題。我會很高興,如果有人可以解釋爲什麼:

SwigPyObjectType = type(SWIGBuiltinClass) 

class Meta(SwigPyObjectType): 
    pass 

class Thing(SWIGBuiltinClass): 
    __metaclass__ = Meta 

Thing.myattr = 'anything' # Works fine this time