我想使用多重继承将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方法。有办法解决这个问题吗?
答案 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。