python - Python 中的 getter 和 setter

标签 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并表示:预期类型为“datetime”,得到了“str”。当设置时要转换为日期时,它如何获得字符串。为什么会发生这种情况?困惑。

例如:

>>> 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

最佳答案

您不能使用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') (对未绑定(bind)方法的调用)对 self._date 的方法调用.

关于python - Python 中的 getter 和 setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47527272/

相关文章:

python - 在 PyQt4 中访问 QTextHtmlImporter

python - 创建一列,其中值是 python 中另一列范围的最大值

python - beanstalkd中如何使用回调?

Python:用其他字符串包围字符串的一部分?

c++ - 有人可以解释这个继承代码吗?

python - 机器学习 : find the closest results to a queried vector

python - Pytorch:在 dataloader.dataset 上使用 torch.utils.random_split() 后,数据中缺少批量大小

ios - 推断错误: External Error: *** capture failed to execute: exited with code 65

php - 面向对象的性能问题

ruby-on-rails - Ruby 和 SQL 中的重复业务逻辑