为什么我在Python中遇到此属性错误?

时间:2012-08-09 18:57:58

标签: python

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

  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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

card1以某种方式引用了一个函数(你在函数或方法调用中省略了括号吗?)。

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

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

  

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