Как установить свойство python в __init__ - PullRequest
23 голосов
/ 15 октября 2010

У меня есть класс с атрибутом, который я хочу превратить в свойство, но этот атрибут установлен в __init__.Не уверен, как это должно быть сделано.Без установки свойства в __init__ это легко и хорошо работает

import datetime

class STransaction(object):
    """A statement transaction"""
    def __init__(self):
        self._date = None

    @property
    def date(self):
        return self._date

    @date.setter
    def date(self, value):
        d = datetime.datetime.strptime(value, "%d-%b-%y")
        self._date = d

st = STransaction()
st.date = "20-Jan-10"

Но как только инициализация должна произойти в __init__, она усложняется, и я не уверен в правильном направлении действий.

class STransaction(object):
    """A statement transaction"""
    def __init__(self, date):
        self._date = None

Как ни странно, следующее работает, но пахнет очень плохо.

class STransaction(object):
    """A statement transaction"""
    def __init__(self, date):
        self._date = None
        self.date = date

    @property
    def date(self):
        return self._date

    @date.setter
    def date(self, value):
        d = datetime.datetime.strptime(value, "%d-%b-%y")
        self._date = d

Как правильно настроить свойства в __init__?

Спасибо, Аарон.

Ответы [ 2 ]

23 голосов
/ 15 октября 2010

Я не вижу никаких реальных проблем с вашим кодом. В __init__ класс полностью создан и, следовательно, доступны свойства.

5 голосов
/ 15 октября 2010
class STransaction(object):
    """A statement transaction"""
    def __init__(self, date):
        self._date = None #1
        self.date = date  #2

Если вы хотите установить прокси self._date объект без выполнения вашего установщика, используйте строку # 1. Если вы хотите запустить установщик при запуске, используйте # 2. Оба способа верны, это просто вопрос того, что вам нужно.

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