在__init__中使用python属性?

时间:2011-04-16 07:58:42

标签: python properties

我有一个使用几个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

2 个答案:

答案 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

然后在实例化之前(或之前)不需要设置任何内部属性。