Python: вызов метода производного класса из другого класса - PullRequest
0 голосов
/ 11 июля 2019

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

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

Iхотел вызвать 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 дано)

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

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

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

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")
0 голосов
/ 11 июля 2019

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

clr = MyClass.MyClass()

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

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

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

clr = MyClass.MyClass(arg1, arg2, arg3)
clr.getB()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...