Python - TypeError: несвязанный метод - PullRequest
5 голосов
/ 24 августа 2010

Итак, эта проблема с 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 не очень хорошая практика кодирования, правильно?

Спасибо за вашу помощь!

Ответы [ 2 ]

4 голосов
/ 24 августа 2010

Обновление

Вы определяете 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 должна оказаться полезной.

1 голос
/ 24 августа 2010

Во-первых, всегда используйте классы нового стиля, т.е. наследуйте от object.(Это не нужно, если вы используете Python 3, в котором есть только классы нового стиля)

Во-вторых, вызов __init__ очень вероятен здесь - если вы хотите создать новый объект, просто напишите Object(x, y, char, color).

...