我有一个使用几个属性()的类。修改文本的字体、大小或字符串等。将需要重新渲染一个表面来缓存。
在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
在text属性中,您可以这样写:
try:
return self._text
except AttributeError:
self._text = None
return self._text
则不需要在实例化前(或实例化后)设置任何内部属性。
第一次调用setter时,由于后备字段self._text
尚未定义,因此失败
简单地在类级别初始化它:
class DrawText(object):
_text = None
# your code here
另一种解决方案(在您的情况下)是简单地手动设置属性的后备字段和脏标志,因为新对象无论如何都可能被认为是脏的。