我是Python的新手。我写了两个类,第二个有第一个的实例作为成员变量。现在我想通过类1中的实例调用Class2的方法。我找不到答案。像这样:
class Class1:
def uselessmethod(self):
pass
class Class2:
def __init__(self):
self.c = Class1()
def call_uselessmethod(self):
self.c.uselessmethod()
k = Class2
k.call_uselessmethod() # Error!
给出以下错误:
k.call_uselessmethod() #Error
TypeError: call_uselessmethod() missing 1 required positional argument: 'self'
知道这里发生了什么?提前谢谢。
答案 0 :(得分:2)
call_uselessmethod
要求在使用之前首先有Class2
的实例。但是,通过这样做:
k = Class2
您没有将k
分配给Class2
的实例,而是Class2
本身。
要创建Class2
的实例,请在类名后添加()
:
k = Class2()
k.call_uselessmethod()
现在,您的代码将起作用,因为k
指向Class2
的实例。
答案 1 :(得分:1)
要创建实例,您需要调用类k = Class2()
。
k = Class2
为类创建了一个别名,而 k.call_uselessmethod``创建了一个非绑定方法,要求您将该实例作为参数传入。
这是一个准确解释发生了什么的会话:
>>> k = Class2 # create an alias the Class2
>>> k == Class2 # verify that *k* and *Class2* are the same
True
>>> k.call_uselessmethod # create an unbound method
<unbound method Class2.call_uselessmethod>
>>> k.call_uselessmethod() # call the unbound method with the wrong arguments
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
k.call_uselessmethod() # call the unbound method with the wrong arguments
TypeError: unbound method call_uselessmethod() must be called with Class2 instance as first argument (got nothing instead)
注意,Python2.7.6中的错误消息已经改进了你所看到的: - )
答案 2 :(得分:0)
声明:
k = Class2
实际上是将变量k
分配给类本身,这是一个type
对象。请记住,在Python 中,所有都是一个对象:类只是type
个对象。
>>> class Class2: pass
...
>>> k = Class2
>>> type(k)
>>> <class 'type'>
您想要的是Class2
的实例。为此,你必须调用Class2
的构造函数:
k = Class2()