繁体   English   中英

Python中的Getter和Setter

[英]Getters and setters in Python

我对Python完全陌生,我正在尝试编写一个类,该类将仅存储两个属性,其中一个旨在用作数字,另一个旨在用作日期时间对象。 尽管我也想在将date存储为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

date不能同时用于property对象和实例属性。 仅属性可用(因为它是数据描述符 ),而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的方法调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM