Является ли мое 'fix' правильным / хорошим методом?
У меня есть класс Text (), который кэширует свою поверхность для рендеринга, если только шрифт / размер не изменятся.(Я оставил свойство шрифта из фрагмента)
Если я попытаюсь использовать self.size
в __init__
, произойдет сбой:
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'
Мне удалось назначить self._text
в __init__
, но я считаю, что это неправильно, так как:
- Игнорирует установщик, который может иметь дополнительные проверки
- код может сломаться, если
_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()