python property()在类使用问题中,setter显示TypeE

2024-09-30 06:21:56 发布

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

我正在编一个关于codechalleng.es的小程序,完全没有想法了。 问题如下: task description

我需要写一个类,返回布尔真/假,无论提升是否过期。 它是通过调用getter promotion.expired属性来测试的(请参阅最后的测试)

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\u time(一个datetime对象)传递给setter时,它应该能够比较datetime和datetime——相反,程序说它是一个bool。不知道如何进行。谢谢你的洞察力

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)

Tags: intestselfdatetimetimedefpropertysimple
1条回答
网友
1楼 · 发布于 2024-09-30 06:21:56

我终于发现了这个问题—对于经历过这种setter/property()行为的人来说,这可能很有趣(如果我不应该回答自己的问题/结束话题等,请纠正我。)

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

将代码更改为后(仅在self中添加一个下划线。\u expired-更改名称以使其不与property()name重叠):

def checkpromo(self):
    return self._expired

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

成功了!谢谢

编辑-添加优雅的decorator解决任务的方法(在将我的任务提交给codechaleng.es后作为答案提供)

from datetime import datetime

NOW = datetime.now()


class Promo:

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

    @property
    def expired(self):
        return datetime.now() > self.expires

相关问题 更多 >

    热门问题