Python: Call method by instance object: “missing 1

2019-02-27 06:09发布

问题:

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.

回答1:

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.



回答2:

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 :-)



回答3:

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()