【发布时间】:2011-12-16 00:51:52
【问题描述】:
我的“修复”是正确/良好的实践方法吗?
我有一个 Text() 类,它缓存要渲染的表面,除非字体/大小发生变化。 (我从 sn-p 中留下了字体属性)
如果我尝试在 __init__ 中使用 self.size ,它将失败:
Traceback (most recent call last):
File "temp.py", line 21, in <module>
t = Text("arial", 6)
File "temp.py", line 3, in __init__
self.size = size
File "temp.py", line 16, in size
if self._size != px:
AttributeError: 'Text' object has no attribute '_size'
我能够在 __init__ 中分配 self._text ,但我认为这是错误的,因为:
- 忽略 setter,它可能有额外的检查
- 如果
_text更改,代码可能会中断,但如果它使用 属性。
错误代码:
class Text(object):
def __init__(self, font, size=12):
self.size = size
self.font = font
self.dirty = False
def draw(self):
print "Draw: ", self.size, self.font, self.dirty
@property
def size(self):
return self._size
@size.setter
def size(self, px):
if self._size != px:
self._size = px
self.dirty=True
if __name__ == "__main__":
t = Text("arial", 6)
t.draw()
t.size = 8
t.draw()
我的修复:
class Text(object):
def __init__(self, font, size=12):
self.size = size
self.font = font
self.dirty = False
def draw(self):
print "Draw: ", self.size, self.font, self.dirty
@property
def size(self):
return self._size
@size.setter
def size(self, px):
try:
if self._size != px:
self._size = px
self.dirty=True
except:
self._size = 14
self.dirty = True
if __name__ == "__main__":
t = Text("arial", 6)
t.draw()
t.size = 8
t.draw()
【问题讨论】:
-
为什么要在
__init__期间使用该属性才能开始?根据定义,当您创建一个新实例时,它的属性无论如何都是新的/脏的!只需在__init__期间直接设置self._size,IMO。
标签: python properties