Python中的getter和setters

2024-05-07 00:04:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python完全陌生,我正试图编写一个类,它只存储两个属性,一个是数字,另一个是datetime对象。虽然我也希望在将date存储为日期时间时,使用类似于“的字符串初始化并输出它”年月日". 所以我要说:

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。它怎么可能得到一个字符串,当它被转换成日期时设置。为什么会这样?困惑的。在

例如:

^{pr2}$

Tags: 字符串selfnonenumberdatetimedatereturn属性
1条回答
网友
1楼 · 发布于 2024-05-07 00:04:02

不能将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的方法调用。在

相关问题 更多 >