HasTraits覆盖了继承的getter / setter方法

时间:2015-06-15 21:54:01

标签: python enthought traits

我想使用多重继承将HasTraits与标准python object混合使用。当我这样做时,标准对象的getter / setter方法不能按预期运行。以下示例演示了这一点。

from traits.api import HasTraits


class A(object):
    @property
    def name(self):
        print 'getter'
        try:
            return self._name
        except(AttributeError):
            return 'nobody'

    @name.setter
    def name(self, val):
        print 'setter'
        self._name = val.upper()

class B(A, HasTraits):
    pass


b = B()
b.name  #calls getter 

b.name = 'name' # doesnt call setter
b.name # doesnt call getter

我认为这是因为HasTraits类拦截了标准的get / set方法。有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

我很确定没有办法让特性与原生的python decorator @property很好地配合。至少,没有任何合理的清洁方式。

然而,traits对getter和setter有自己的Property概念。您可以定义一个Property特征,它可以作为一个简单的getter / setter来做你想要的。

class B(A, HasTraits):
    this_name = Property
    def _get_this_name(self):
      return self.name
    def _set_this_name(self, value):
      self.name = value

如果你继承了包含HasTraits的{​​{1}},那么特定于traits的getter / setter效果将保留在子类中。所以没有理由 - 如果你已经想要在你的程序中对特征进行类型检查 - 首先使用Property装饰器而不是@property getter。