Python: вызвать метод производного класса из другого класса

Я искал все, что связано с этим вопросом о стеке, но это не удовлетворило мою проблему.

BaseHandler.py

class BaseHandler(object):

    def __init__(self, rHandler, path, param):
            self._rHandler = rHandler
            self._server = self._rHandler.server
            self._path = path
            self._param = param

    def _getElement(self, name):
        return name + "append"

MyClass.py

class MyClass(BaseHandler.BaseHandler):

    def getA(self):
        print "Some info"

    def getB(self):
        el = self._getElement("T") #baseclass method
        print ebl

Я хотел вызвать getB из класса ниже.

RThread.py

import MyClass
class RThread(object):

    def someMethod(self):
        clr = MyClass.MyClass
        clr.getB()

Я получаю следующую ошибку:

TypeError: unbound method getB() must be called with MyClass instance as first argument (got nothing instead)

Когда я пытаюсь сделать следующее:

clr = MyClass.MyClass()

Я получаю следующую ошибку:

init() принимает ровно 4 аргумента (дан 1)

Пожалуйста, помогите мне, как вызвать этот метод из другого класса.


person user2660409    schedule 11.07.2019    source источник
comment
ваш отступ правильный? судя по всему у тебя ничего нет ни в одном из классов   -  person Vaibhav Sharma    schedule 11.07.2019
comment
Вы на правильном пути: сначала вам нужен действительный экземпляр MyClass. Поскольку MyClass не переопределяет __init__, посмотрите на BaseHandler.__init__, чтобы узнать, какие аргументы ожидаются.   -  person chepner    schedule 11.07.2019
comment
@VaibhavSharma извините, мой отступ был неправильным. Я плохо пишу скрипт на stackoverflow.   -  person user2660409    schedule 11.07.2019
comment
@chepner baseHandler также является производным классом базового класса (и так далее). Один из аргументов BaseHandler относится к базовому классу. Как справиться с этим?   -  person user2660409    schedule 12.07.2019
comment
Подпись типа BaseHandler.__init__ — единственное, что имеет значение для ваших целей. Что он делает со своими аргументами, это его личное дело.   -  person chepner    schedule 12.07.2019


Ответы (2)


Вам нужно создать экземпляр класса, чтобы вызвать для него метод.

def someMethod(self):
    clr = MyClass.MyClass(*args)
    clr.getB()

В случае, если вы хотите, чтобы метод вызывался из класса, вам нужно использовать либо @staticmethod, либо @classmethod

@staticmethod
def getB():
    return self._getElement("T")

Однако вы используете нотацию self., для которой требуется экземпляр. Таким образом, вам также нужно будет пометить метод _getElement с помощью @staticmethod. Статические методы не имеют доступа к родительскому классу. Для этого вы можете использовать декоратор @classmethod.

@classmethod
def getB(cls):
    return cls._getElement("T")
person Jmonsky    schedule 11.07.2019
comment
Немного придирки, но наличие параметра с именем self не означает, что вам нужен экземпляр — в имени self нет ничего особенного, его просто принято использовать для привязки экземпляра в методе. - person JBGreen; 11.07.2019

Вы неправильно вызываете метод; вам нужно создать объект. Вот как вы создаете объект, что вы и делали, за исключением того, что вы не передавали достаточно параметров.

clr = MyClass.MyClass()

Поскольку MyClass наследуется от BaseHandler и вы не переопределили его конструктор, вы используете конструктор от BaseHandler, который имеет четыре аргумента, один из которых self.

def __init__(self, rHandler, path, param):
    ...

Итак, попробуйте что-то вроде этого:

clr = MyClass.MyClass(arg1, arg2, arg3)
clr.getB()
person brandonwang    schedule 11.07.2019