【问题标题】:Python - TypeError: unbound methodPython - TypeError:未绑定的方法
【发布时间】:2011-04-03 07:16:27
【问题描述】:

因此,自从我尝试将代码重构为不同的文件以来,这个 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 的类并不是一个很好的编码习惯,对吗?

感谢您的帮助!

【问题讨论】:

    标签: python initialization attributeerror


    【解决方案1】:

    更新

    您正在一个名为object.py 的文件中定义Object。然而客户指的是object_info.Object。这是笔误吗?

    另外我认为拥有一个名为 Object 的类并不是一个很好的编码习惯,对吗?

    正确。将您的课程重命名为其他名称,例如 GenericObjectGenericBase。也不要使用模块名称object.py。适当地改变它。

    还有

    您正在构建Object 的实例,但您的操作方式是错误的。试试这个:

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

    来自 Dive Into Python 的 chapter 应该很有用。

    【讨论】:

    • 这不太行,我在编译时仍然得到相同的 AttributeError。
    • 我实际上将对象作为 object_info 导入,所以这不是问题。但是我意识到我正在导入在 object.py 文件中调用 object.py 的文件,我认为这是一个很大的不,因为删除它会导致错误不再发生。
    【解决方案2】:

    首先,始终使用新式类,即继承自 object。 (如果您运行的是只有新式类的 Python 3,则不需要这样做)

    其次,这里调用__init__很可能是错误的——如果你想实例化一个新的对象,就写Object(x, y, char, color)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 2017-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多