我正在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)
我终于找到了问题-对于遇到这样的setter / property()行为的人来说,这可能很有趣。 (如果我不应该回答我自己的问题/关闭主题,请更正我。)
在我的示例中,属性expired与私有属性self的名称相同。expired。
将代码更改为(只需在self._expired中添加一个下划线-更改名称,使其不与property()名称重叠):
def checkpromo(self):
return self._expired
def setpromo(self, value):
self._expired = value < datetime.now()
成功了!谢谢