2013-11-16 2 views
2

Я новичок в Python. Я написал два класса, второй - экземпляр первого в качестве переменной-члена. Теперь я хочу вызвать метод класса 2 через экземпляр его в первом классе. Я не мог найти ответа. Что-то вроде этого:Python: вызов метода по экземпляру object: "missing 1 required positional argument: 'self'"

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' 

Любая идея о том, что происходит здесь? Заранее спасибо.

ответ

2

call_uselessmethod требует, чтобы перед вами использовался экземпляр Class2. Однако, делая это:

k = Class2 

вы не назначая k к экземпляру Class2, а скорее сам Class2.

Чтобы создать экземпляр Class2, добавьте () после имени класса:

k = Class2() 
k.call_uselessmethod() 

Теперь, ваш код будет работать, потому что k указывает на экземпляр Class2, как это должно быть.

+0

Ой, спасибо, с завязанными глазами. Просто забыли скобки ... –

0

Оператор:

k = Class2 

фактически присваивая переменной kк классу самого, который является объектом type. Помните, что в Python все - это объект: классы - это просто type объектов.

>>> class Class2: pass 
... 
>>> k = Class2 
>>> type(k) 
>>> <class 'type'> 

То, что вы хотите, это экземпляр из Class2. Для этого необходимо вызвать конструктор Class2 «s:

k = Class2() 
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 была улучшена за то, что вы видели :-)

Смежные вопросы