我有一个使用几个property()的类。修改文本的字体,大小或字符串等将需要重新渲染要缓存的曲面。
在 init 中调用类自己的属性()的推荐方法是什么?问题是该变量尚未设置,当时我想调用@property DrawText.text
如果我直接设置._text,它会运行:
class DrawText(object):
"""works, Except ignores text.setter"""
def __init__(self):
# self.text = "fails" # would fail if here
self._text = "default"
self.text = "works"
@property
def text(self):
'''plain-text string property'''
return self._text
@text.setter
def text(self, text):
if self._text == text: return
self._text = text
self.dirty = True # .. code re-creates the surface
这也会运行,并且更接近,但它是否可以使用不同的数据处理多个实例?
class DrawText(object):
"""works, Except ignores text.setter"""
def __init__(self):
DrawText.text = "default"
self.text = "works"
@property
def text(self):
'''plain-text string property'''
return self._text
@text.setter
def text(self, text):
if self._text == text: return
self._text = text
self.dirty = True # .. code re-creates the surface
答案 0 :(得分:2)
失败是因为第一次调用setter时尚未定义支持字段self._text
。
在类级别上简单地初始化它:
class DrawText(object):
_text = None
# your code here
另一个解决方案(在您的情况下)将简单地手动设置属性的支持字段和脏标志,因为无论如何新对象可能被认为是脏的。
答案 1 :(得分:2)
在 text 属性中,您可以这样写:
try:
return self._text
except AttributeError:
self._text = None
return self._text
然后在实例化之前(或之前)不需要设置任何内部属性。