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'、関数オブジェクトが行のカードと比較されていると推測されますif (card1 > card2):。これは、カードの1つが誤って機能として割り当てられた場合に発生する可能性があります。たとえば、のcard1 = getMyOtherCard代わりにcard1 = getMyOtherCard()

于 2012-08-09T19:15:26.803 に答える
2

card1どういうわけか関数を参照するようになりました(関数またはメソッド呼び出しの括弧を省略しましたか?)。

その結果、(オブジェクトには比較演算子がないため)card1 < card2に再配置されます。これが呼び出される理由です。card2 < card1function__lt__

http://docs.python.org/reference/datamodel.html#object .__ lt__から:

これらのメソッドのスワップ引数バージョンはありません(左の引数が操作をサポートしていないが、右の引数はサポートしている場合に使用されます)。むしろ、__lt__()そして__gt__()お互いの反射です[...]

于 2012-08-09T19:14:45.330 に答える