【问题标题】:Unbound method error未绑定方法错误
【发布时间】:2017-03-17 16:21:23
【问题描述】:

我试图理解 Python 类中的 self 关键字。因此我编了一个简单的类:

class Question(object):
    """A class for answering my OO questions about python.

       attributes: a_number"""

    def __init__():
        print "You've initialized a Question!"

    def myself_add(self, new_number):
        self.a_number += new_number

在类定义下方的__main__ 函数中,我正在运行代码

my_q = Question
print my_q
my_q.a_number = 12
print 'A number:',my_q.a_number
my_q.myself_add(3)
print 'A number:',my_q.a_number

我得到的结果(包括错误)是

<class '__main__.Question'>
A number: 12
Traceback (most recent call last):
  File "question.py", line 21, in <module>
    my_q.myself_add(3)
TypeError: unbound method myself_add() must be called with Question instance as first argument (got int instance instead)

我试图理解为什么 myself_add 方法被认为是未绑定的。这意味着什么?为什么它不知道我在 Question 类的实例上调用它?另外,为什么我的__init__ 打印没有发生?

【问题讨论】:

  • 为了创建一个实例你应该写Question()
  • __init__() 也需要一个 self 参数。
  • @PawełKordowski OMG,我不敢相信事情就这么简单。谢谢!把它扔到一个答案中,我会接受它。

标签: python python-2.7 oop self


【解决方案1】:

要创建实例,您需要编写 Question() 而不是 Question

__init__ 至少应该接受 self 参数

你可能还想在__init__中初始化self.a_number或者放入类体中,否则不执行my_q.a_number = 12myself_add的调用会失败

【讨论】:

    【解决方案2】:

    “self”参数可以是任何东西,但按照惯例称为 self。

    python默认为你传入。

    你可以尝试运行这个简单的代码 sn-p 看看我的意思:

    class A(object):
        def __init__(self):
            pass
        def check(self, checked):
            print self is checked
    

    然后从命令行:

    a=A()
    a.check(a)
    

    你可以这样进一步:

    In [74]: b=A()
    
    In [75]: a.check(b)
    False
    

    所以在这里我创建了 A 的两个实例,一个称为一个称为 b。只有当 a 的 self 与 a 本身进行比较和实例时,该陈述才是正确的。

    希望这是有道理的。

    具体而言,您的类 Question 需要被实例化 (Question()) 并且您的 __init__ 需要一个参数(按照惯例为 self)。

    在绑定函数时,您可能会发现此答案很有帮助:

    What is the difference between a function, an unbound method and a bound method?(但可能是提前出价)

    【讨论】:

    • 很好的参考,詹姆斯。我已经习惯了你必须在语法上区分类和实例方法的语言,所以这真的让事情变得更清楚了!
    【解决方案3】:

    首先,当你初始化一个类的实例时,你使用左括号和右括号,按照惯例调用__init__方法。

    my_q = Question()
    

    但是,在您的情况下,您的 __init__ 方法未绑定到使用 self 的对象,因此如果您按原样运行它会出错,

        my_q = Question()
    TypeError: __init__() takes no arguments (1 given)
    >>> 
    

    您需要使用self 初始化__init__,以便实例可以对对象进行隐式调用。

    def __init__(self):
    

    现在,程序运行顺利 首先打印的是 my_q 对象本身。

    >>> 
    You've initialized a Question!
    <__main__.Question object at 0x028ED2F0>
    A number: 12
    A number: 15
    

    【讨论】:

      猜你喜欢
      • 2017-11-06
      • 2011-08-26
      • 1970-01-01
      • 2017-07-19
      • 1970-01-01
      • 2016-11-30
      • 2016-04-17
      • 2016-09-15
      • 2023-03-09
      相关资源
      最近更新 更多