This question already has an answer here:
-
TypeError: attack() missing 1 required positional argument: 'self'
2 answers
I'm new to Python. I've written two Classes, the second one has an instance of the first one as a member variable. Now I want to call a method of Class2 via the instance of it in class one. I could not find an answer for it. Something like this:
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!
Gives the following error:
k.call_uselessmethod() #Error
TypeError: call_uselessmethod() missing 1 required positional argument: 'self'
Any idea of what is going on here? Thanks in advance.
call_uselessmethod
requires that there first be an instance of Class2
before you use it. However, by doing this:
k = Class2
you are not assigning k
to an instance of Class2
but rather Class2
itself.
To create an instance of Class2
, add ()
after the class name:
k = Class2()
k.call_uselessmethod()
Now, your code will work because k
points to an instance of Class2
like it should.
To create the instance, you need to call the class, k = Class2()
.
What was really happening the that k = Class2
created an alias to the class and
k.call_uselessmethod`` created an unbound method which requires that you pass in the instance as the argument.
Here is a session that explains exactly what is happening:
>>> 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)
Note, the error message in Python2.7.6 has been improved over what you were seeing :-)
The statement:
k = Class2
Is actually assigning the variable k
to the class itself, which is a type
object. Remember, in Python everything is an object: classes are simply type
objects.
>>> class Class2: pass
...
>>> k = Class2
>>> type(k)
>>> <class 'type'>
What you want is an instance of Class2
. For that you must call Class2
's constructor:
k = Class2()