未绑定方法错误
Unbound method error
我正在尝试理解 python class 中的 self
关键字。因此,我编了一个简单的 class:
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
在 class 定义下方的 __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
class 的实例上调用它?另外,为什么我的 __init__
打印不出来?
为了创建实例,您需要编写 Question()
而不是 Question
。
__init__
应该至少接受 self 参数
你可能还要在__init__
中初始化self.a_number
或者放入class体中,否则不执行的话myself_add
的调用会失败my_q.a_number = 12
"self" 参数可以是任何东西,但按照惯例称为 self。
默认由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 的两个实例,一个叫做 a,一个叫做 b。仅当将 a 的自身实例与 a 自身进行比较时,该语句才为真。
希望这是有道理的。
特别是在你的情况下,你的 class Question
需要被实例化(Question()
)并且你的 __init__
需要一个参数(按照惯例自我)。
关于绑定函数时,您可能会发现这个答案很有帮助:
What is the difference between a function, an unbound method and a bound method?(但可能是提前出价)
首先,当您初始化 class 的实例时,您使用左括号和右括号按照约定调用 __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
我正在尝试理解 python class 中的 self
关键字。因此,我编了一个简单的 class:
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
在 class 定义下方的 __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
class 的实例上调用它?另外,为什么我的 __init__
打印不出来?
为了创建实例,您需要编写 Question()
而不是 Question
。
__init__
应该至少接受 self 参数
你可能还要在__init__
中初始化self.a_number
或者放入class体中,否则不执行的话myself_add
的调用会失败my_q.a_number = 12
"self" 参数可以是任何东西,但按照惯例称为 self。
默认由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 的两个实例,一个叫做 a,一个叫做 b。仅当将 a 的自身实例与 a 自身进行比较时,该语句才为真。
希望这是有道理的。
特别是在你的情况下,你的 class Question
需要被实例化(Question()
)并且你的 __init__
需要一个参数(按照惯例自我)。
关于绑定函数时,您可能会发现这个答案很有帮助:
What is the difference between a function, an unbound method and a bound method?(但可能是提前出价)
首先,当您初始化 class 的实例时,您使用左括号和右括号按照约定调用 __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