используя свойства python внутри __init__? - PullRequest
4 голосов
/ 16 апреля 2011

У меня есть класс, использующий несколько свойств ().Изменение шрифта, размера или строки текста и т. Д. Потребует повторного рендеринга поверхности для кэширования.

Каков рекомендуемый способ вызова собственного свойства класса () внутри 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 ]

2 голосов
/ 16 апреля 2011

В своем свойстве text вы можете написать это:

try:
    return self._text
except AttributeError:
    self._text = None
return self._text

Тогда нет необходимости устанавливать какие-либо внутренние атрибуты перед (или включением) экземпляром.

2 голосов
/ 16 апреля 2011

Сбой, потому что поле поддержки self._text еще не определено, когда сеттер вызывается в первый раз.

Просто инициализируйте его на уровне класса:

class DrawText(object):
    _text = None
    # your code here

Другим решением (в вашем случае) было бы просто установить поле поддержки свойства и флаг грязи вручную, поскольку новый объект, вероятно, все равно считается грязным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...