【问题标题】:Python TypeError: unbound method must be called with instance as first argumentPython TypeError:必须以实例作为第一个参数调用未绑定的方法
【发布时间】:2014-12-10 18:31:32
【问题描述】:

为了学习OOP,我尝试写一个基于终端的RPG,所以我写了这段代码:

class car(object):  #car is the short form of Character
  def __init__(self):
    self.leben = 100
    self.speed = 10
    self.SD = 20
  def attack(self, life):
    #life-= self.SD
    #return life
    pass
  def stats(self):
    print 'Leben: '
    print self.leben
    print 'Geschwindigkeit: ' 
    print self.speed
    print 'Schaden: '
    print self.SD

class wojok(car): 
  def __init__(self):
    super(car.__init__(self)).__init__()
    self.SD = 50


C = wojok()
while True:
  e = raw_input('Befehl: ')
  if e == 'info':
    C.stats()
  elif e == 'stop':
    break

现在我得到了错误:

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

但是当我尝试将 car 的实例作为第一个参数传递给 init 时,我得到了错误:

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

我必须使用什么作为第一个参数?

【问题讨论】:

  • @gmauch 我认为不是这样,尤其是在查看已接受的答案时。问题似乎是在 OP 的代码中滥用了 super(因此试图调用未绑定的 __init__)。
  • @AndrasDeak 我是 Python 新手,可能错过了一些细节,但我遇到了同样的问题,Google 显示了 7 个标题几乎相同的问题(1,2,3, 4,5,67)。我需要一些时间来分析它们并相应地标记它们,除非有更快的方法来做到这一点
  • @gmauch 在这种特定情况下很好,这个问题有一个很好的具体答案,而你的欺骗目标有一个非常模糊的解释。无论如何,我建议不要将各种旧的和不活跃的问题标记为关闭。这对社区没有帮助:) 如果您希望标记为关闭,请针对新问题,这样您可以防止重复问题的新答案。总体思路是“只有在有一些非常新的活动时才标记/投票关闭旧问题”。
  • @AndrasDeak 感谢您的解释,但是我在哪里可以找到这条“如果有一些非常新的活动,只有标记/投票关闭旧问题”规则?在我看来,无论年龄多大,骗子都是骗子。在我的情况下(以及其他任何有同样问题的人),如果只引用一个问题会更好,所以我不必搜索 7 个(据说)非常相似的问题。看起来他们每个人的 OP 在询问之前都没有在 StackOverflow 中进行太多搜索。你认为在 Meta 中问这个值得吗?

标签: python class oop instance


【解决方案1】:

class wojok(car): 
  def __init__(self):

这一行:

    super(car.__init__(self)).__init__()

应该是

    super(wojok, self).__init__() 

但是,如果您只想拥有具有不同属性值的不同 car 实例,只需将它们传递给初始化程序(可能带有默认值):

class Character(object):
    def __init__(self, leben=100, speed=10, sd=20):
        self.leben = leben
        self.speed = speed
        self.sd = sd

然后你要么实例化Character,不带参数来获取默认值,要么指定你想要的,即:

default_char = Character()
special_char = Character(sd=100)

注意:python 命名约定:对类使用CapCase,对变量和函数使用all_lower,对伪常量使用ALL_UPPER,并且更喜欢描述性名称而不是缩写(除非缩写是真正的“描述性”名称本身)。

当然,如果 wojok 实例应该具有与“标准”Character 不同的行为(并且您省略了它,因为它与这里无关)子类化是一个合适的解决方案;)

【讨论】:

    猜你喜欢
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 2018-05-10
    • 1970-01-01
    • 2017-04-03
    相关资源
    最近更新 更多