Pythonトレイトで使用するために非トレイトモデルクラスをラップしたいと思います。私の目標は、「外部」モデルクラスを操作するためのTraitsベースのUIを作成することです。外部モデルクラスはSWIGによって生成されているため、祖先としてenthought.traits.api.HasTraitsを追加することはできません(間違っているかもしれませんが)。
私の現在の最善の試みは
from enthought.traits.api import HasStrictTraits, Property, Instance
class ExternalModel():
foo = 'foo'
class TraitsModel(HasStrictTraits):
_e = Instance(ExternalModel)
def __init__(self):
self._e = ExternalModel()
self.add_trait('foo', Property(lambda :getattr(self._e,'foo' ),
lambda attr:setattr(self._e,'foo',attr)))
これにより、TraitsベースのクラスTraitsModelは、含まれている非TraitsExternalModelインスタンスに委任する可変プロパティを持ちます。ただし、TraitsModel.trait_names()は、認識された特性として「foo」を報告しません。
TraitsModelにExternalModelにリンクされている「foo」トレイトを報告させる方法についての提案はありますか?enthought.traits.api.DelegatesToは、ターゲットがTraitsクラスである必要があるようです(ただし、正しい呼び出しが見つからなかった可能性があり、それは可能です)。
よりMVC風のアプローチは、おそらく、ExternalModelのトレイトベースのビューを持つことです。トレイトベースのビューに非トレイトモデルがあることを理解できませんでした。その方向への提案も大歓迎です。
更新http://agentzlerich.blogspot.com/2011_05_01_archive.htmlのアプローチを使用して、HasTraitsをExternalModelスーパークラスとして取得する方法を理解しましたが、これは完全に時間の無駄だったようです。どうやらSWIGブードゥーとトレイツフードゥーはジャイブしません。この質問が尋ねるように、TraitsModel内でExternalModelをラップするのが最善の方法のようです。