Python中的getter和setter

时间:2017-11-28 08:43:33

标签: python python-3.x oop datetime properties

我对Python完全陌生,我试图编写一个类,它只存储两个属性,其中一个属于数字,另一个属于日期时间对象。虽然我也希望在将date存储为日期时间时,使用类似" dd.mm.yyyy"这样的字符串初始化并输出它。我走了:

class MyClass:
    number = None
    date = None

    def __init__(self, params):
        self.number = params["number"]
        self.date = params["date"]

    @property
    def date(self):
        return datetime.datetime.strftime(self.date, '%d.%m.%Y')

    @date.setter
    def date(self, value):
        self.date = datetime.datetime.strptime(value, '%d.%m.%Y')

    def get_vars(self):
        return vars(self)

但在运行时@property指向self.date并说:Expected type 'datetime', got 'str' instead。如果它在设置时意味着转换为日期,它怎么能得到一个字符串。为什么会这样?困惑。

例如:

>>> MyClass({'number': 42, 'date': '28.12.2017'})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 8, in __init__
  File "<string>", line 16, in date
  File "<string>", line 16, in date
TypeError: strptime() argument 1 must be str, not datetime.datetime

1 个答案:

答案 0 :(得分:3)

您不能对date对象和实例属性使用property。只有属性可用(因为它是data descriptor),self.date引用该属性对象。表达式self.date = params['date']param['date']值传递给setter,它没有设置实例属性。

因为param['date']显然是你的datetime对象,这意味着在调用setter datetime.datetime.strptime(<datetime instance>, '%d.%m.%Y')时会失败。即使成功了,您也会尝试将结果分配回self.date,这会无限次地再次调用setter。它是一个datetime实例,因为您最初传入了datetime值,传入了一个字符串,第一个.strptime()调用成功了,现在正在为self.date分配刚刚创建的datetime实例。

重命名实例属性;给它一个领先的单下划线通常是这里最有用的命名方案:

class MyClass:
    _number = None
    _date = None

    def __init__(self, params):
        self._number = params["number"]
        self._date = params["date"]

    @property
    def date(self):
        return self._date.strftime('%d.%m.%Y')

    @date.setter
    def date(self, value):
        self._date = datetime.datetime.strptime(value, '%d.%m.%Y')

    def get_vars(self):
        return vars(self)

我还将datetime.datetime.strftime(self._date, '%d.%m.%Y')(对未绑定方法的调用)更改为self._date上的方法调用。