未绑定的方法错误

时间:2017-03-17 16:21:24

标签: python python-2.7 oop self

我正在尝试理解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__打印不会发生?

3 个答案:

答案 0 :(得分:1)

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

__init__至少应该采用自我论证

您可能还想在self.a_number中初始化__init__或将其放入类主体,否则如果您不执行myself_add <{1}},则my_q.a_number = 12的调用将失败/ p>

答案 1 :(得分:1)

&#34; self&#34;参数可以是任何东西,但按惯例称为自我。

默认情况下它是由python传入的。

您可以尝试运行这个简单的代码段来查看我的意思:

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的实例。只有当自我与自身进行比较和实例时才是真实的。

希望这是有道理的。

特别是在您的情况下,您的类Question需要实例化(Question())并且您的__init__需要一个参数(按惯例自我)。

当函数绑定时,您可能会发现此答案有用:

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

答案 2 :(得分:0)

首先,在初始化类的实例时,使用按惯例调用__init__方法的开括号和右括号。

my_q = Question()

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

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

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

def __init__(self):

现在,程序运行顺利 第一次打印是my_q对象本身。

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