我正在学习Python。当我尝试调用类中的函数时,我收到此错误。所以请帮我解决这个问题。
tony@kali:~$ python
Python 2.7.13 (default, Jan 19 2017, 14:48:08)
[GCC 6.3.0 20170118] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class H:
... def y():
... print "j"
...
>>> g=H
>>> g.y()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method y() must be called with H instance as first argument (got nothing instead)
>>> H.y()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method y() must be called with H instance as first argument (got nothing instead)
>>>
答案 0 :(得分:1)
您必须初始化class
,然后才能调用class
的方法。此外,方法应将其第一个参数设为self
。
class H:
def y(self):
print "j"
g = H()
g.y()
有关自我的更多详情,请参阅here。
你一定要检查this chapter上课。
答案 1 :(得分:0)
您已获得答案和评论,请让我解释一下错误消息。
在您的代码中,g
和H
是同一个名称的不同名称,因此这两个错误是一个。
现在,H
是一个(旧式)类,所有函数def
都在它下面,除非&#34;处理&#34;使用classmethod
或staticmethod
等技巧的方法。当您将这些方法作为类 H
的属性进行访问时,它们被称为&#34; unbound&#34;方法,因为它们尚未绑定到类H
的实例。
为了理解Python的类,方法和属性的核心模型,我推荐Shalabh Chaturvedi的优秀帖子:
tl; dr版本:通常您需要通过调用实例的绑定方法调用方法:
>>> class H(...):
>>> def y(...):
>>> h_instance = H()
>>> h_instance.y(...)
Python会将该实例(h_instance
放在伪代码片段中)作为该方法的第一个参数。如果将其称为h_instance.y()
,则实际参数列表为(h_instance)
;如果您将其称为h_instance.y(a)
,则参数为(h_instance, a)
。
这就是为什么你几乎总是在方法定义中找到第一个正式参数为self
。除了Python期望为调用该方法的实例保留该槽之外,这个名称没什么特别之处。 允许使用空参数列表定义方法,但是当您实际使用该实例时,该方法不会有用。在这种情况下,您将始终获得TypeError
- 因为调用发送一个参数(&#34; self
&#34;实例),而方法中没有定义
作为演示,请考虑以下会话:
In [1]: class H(object): # New-style class, doesn't matter here.
...: def y(self): # Notice the call signature: "self" included
...: print "j"
In [2]: h_instance = H() # Create an instance from the class
# This is how normally you're expected to call. There's no argument
# passed to the *bound* to the instance h_instance, because when you do
# this Python will carry out the syntactic desugaring and call on the
# instance.
In [3]: h_instance.y()
j
# This does the same thing and demonstrates the concept of an
# unbound method. It's not bound to any specific instance of H, so
# you'll have to specify which instance to call.
In [4]: H.y(h_instance)
j