0

提前感谢您的帮助,我知道这可能是一个新手问题,但我无法通过搜索找到任何似乎可以回答我的问题的内容。这是回溯的相关部分:

  File "war.py", line 183, in __battle
    if (card1 > card2):
  File "war.py", line 24, in __lt__
    return self.int_id % 13 < other.int_id % 13
AttributeError: 'function' object has no attribute 'int_id'

我对这意味着什么感到困惑……什么是“功能”对象?另外,为什么要从大于比较的行中调用lt ?为什么现在这是一个问题,因为我对我的 Card 类(其中 card1 和 card2 是实例)进行了单元测试,包括所有丰富的比较运算符,并且它通过了?

这些是我的 Card 类中丰富的比较方法的定义(您可能会猜到,int_id 只是一个实例变量 int):

(对不起,下面的缩进搞砸了)

class Card():

    def __init__(self, int_id):
        self.int_id = int_id

    def __lt__(self, other):
        return self.int_id % 13 < other.int_id % 13

    def __le__(self, other):
        return self.int_id % 13 <= other.int_id % 13

    def __eq__(self, other):
        return self.int_id % 13 == other.int_id % 13

    def __ne__(self, other):
        return self.int_id % 13 != other.int_id % 13

    def __gt__(self, other):
        return self.int_id % 13 > other.int_id % 13

    def __ge__(self, other):
        return self.int_id % 13 >= other.int_id % 13
4

2 回答 2

5

从错误'function' object has no attribute 'int_id'中,我猜想函数对象正在与行中的 Card 进行比较if (card1 > card2):。如果其中一张卡被错误地分配为功能,则可能会发生这种情况。例如,card1 = getMyOtherCard代替card1 = getMyOtherCard().

于 2012-08-09T19:15:26.803 回答
2

card1以某种方式引用了一个函数(您是否在函数或方法调用上省略了括号?)。

结果,card1 < card2被重新排列为card2 < card1(因为function对象没有比较运算符),这就是__lt__被调用的原因。

来自http://docs.python.org/reference/datamodel.html#object.__lt__

这些方法没有交换参数版本(当左参数不支持操作但右参数支持时使用);相反,__lt__()并且__gt__()是彼此的反映[...]

于 2012-08-09T19:14:45.330 回答