我对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
答案 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
上的方法调用。