5

そのため、コードを別のファイルにリファクタリングしようとして以来、この Python の問題が問題を引き起こしています。object.py というファイルがあり、その中に関連するコードは次のとおりです。

class Object:
#this is a generic object: the player, a monster, an item, the stairs...
#it's always represented by a character on screen.
def __init__(self, x, y, char, color):
    self.x = x
    self.y = y
    self.char = char
    self.color = color

def move(self, dx, dy):
    #move by the given amount, if the destination is not blocked
    #if not map[self.x + dx][self.y + dy].blocked:
        self.x += dx
        self.y += dy

ここで、特にこのファイルをコンパイルしようとすると、次のエラーが発生します。

TypeError: unbound method __init__() must be called with Object instance as first argument (got int instance instead)

これを呼び出そうとするコードは次のとおりです。

player = object_info.Object.__init__(BurglaryConstants.SCREEN_WIDTH/2, BurglaryConstants.SCREEN_HEIGHT/2, '@', libtcod.white)

コンパイル時にこのエラーが発生します:

AttributeError: 'module' object has no attribute 'Object'

では、一体何が起こっているのでしょうか。これをどのようにリファクタリングすればよいのでしょうか? また、Object というクラスを持つことは、あまり良いコーディング方法ではないと思いますよね?

ご協力いただきありがとうございます!

4

2 に答える 2

4

アップデート

Objectというファイルで定義していますobject.py。それでも、クライアントはobject_info.Object. これはタイプミスですか?

また、Object というクラスを持つことは、あまり良いコーディング方法ではないと思いますよね?

正しい。GenericObjectクラスの名前を別の名前に変更しますGenericBase。また、モジュール名を使用しないでくださいobject.py。適宜変更してください。

また

のインスタンスを作成していますがObject、その方法が間違っています。これを試して:

player = object_info.Object(BurglaryConstants.SCREEN_WIDTH/2, BurglaryConstants.SCREEN_HEIGHT/2, '@', libtcod.white)

Dive Into Python のこの章は役に立つはずです。

于 2010-08-24T17:02:17.900 に答える
1

まず、常に新しいスタイルのクラスを使用します。つまり、から継承しobjectます。(新しいスタイルのクラスしかない Python 3 を実行している場合、これは必要ありません)

第 2 に、ここで呼び出し__init__が間違っている可能性が非常に高いです。新しいオブジェクトをインスタンス化したい場合は、単にObject(x, y, char, color).

于 2010-08-24T17:03:01.083 に答える