[python-property()在类使用中出现问题,设置器显示TypeError

问题描述 投票:0回答:1

我正在codechalleng.es上编写一个pybite,完全用尽了所有想法。问题如下:task description

无论促销是否过期,我都需要编写一个返回布尔值True / False的类。通过调用属性getter促销进行了测试。已过期(请参阅最后的测试)

from datetime import datetime, timedelta

NOW = datetime.now()    # defined here for test compatilibity (time)

class Promo:
    """ docstring hehe"""

    def __init__(self, name, expires):
        self.name = name
        self.setpromo(expires)


    def checkpromo(self):
        return self.expired

    def setpromo(self, value):
        self.expired = value < datetime.now()

    expired = property(checkpromo, setpromo)


test_time = NOW + timedelta(days=1)

promotion_10 = Promo('promotion 10%', test_time)

现在,它抛出一个错误,我无法比较setter与datetime对象中的值。在我看来,当我们将test_time(日期时间对象)传递给setter时,它应该能够比较datetime与datetime -程序说这是一个布尔值。不知道如何进行。谢谢您的见解。

Traceback (most recent call last):
  File "/tmp/simple_property.py", line 24, in <module>
promotion_10 = Promo('promotion 10%', test_time)
  File "/tmp/simple_property.py", line 10, in __init__
self.setpromo(expires)
  File "/tmp/simple_property.py", line 17, in setpromo
self.expired = value < datetime.now()
  File "/tmp/simple_property.py", line 17, in setpromo
self.expired = value < datetime.now()
TypeError: '<' not supported between instances of 'bool' and 'datetime.datetime'  

需要通过的测试:

from datetime import timedelta
import inspect

from simple_property import Promo, NOW


def test_promo_expired():
    past_time = NOW - timedelta(seconds=3)
    twitter_promo = Promo('twitter', past_time)
    assert twitter_promo.expired


def test_promo_not_expired():
    future_date = NOW + timedelta(days=1)
    newsletter_promo = Promo('newsletter', future_date)
    assert not newsletter_promo.expired


def test_uses_property():
    assert 'property' in inspect.getsource(Promo)
python class properties typeerror setter
1个回答
0
投票

我终于找到了问题-对于遇到这样的setter / property()行为的人来说,这可能很有趣。 (如果我不应该回答我自己的问题/关闭主题,请更正我。)

在我的示例中,属性expired与私有属性self的名称相同。expired

将代码更改为(只需在self._expired中添加一个下划线-更改名称,使其不与property()名称重叠):

def checkpromo(self):
    return self._expired

def setpromo(self, value):
    self._expired = value < datetime.now()

成功了!谢谢

© www.soinside.com 2019 - 2024. All rights reserved.