无法在Python中调用类中的函数

时间:2017-04-20 11:30:56

标签: python

我正在学习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)
>>> 

2 个答案:

答案 0 :(得分:1)

您必须初始化class,然后才能调用class的方法。此外,方法应将其第一个参数设为self

class H:
   def y(self):
         print "j"
g = H()
g.y()

有关自我的更多详情,请参阅here

你一定要检查this chapter上课。

答案 1 :(得分:0)

您已获得答案和评论,请让我解释一下错误消息。

在您的代码中,gH是同一个名称的不同名称,因此这两个错误是一个。

现在,H是一个(旧式)类,所有函数def都在它下面,除非&#34;处理&#34;使用classmethodstaticmethod等技巧的方法。当您将这些方法作为 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