Передача класса и его функции в другой класс - PullRequest
1 голос
/ 21 февраля 2020

Я хочу передать класс и его методы в класс. У меня нет проблем с передачей класса, так как он доступен во время инициализации экземпляра, но методы (когда передаются отдельно) не являются.

Нефункциональный пример сильно упрощен, и могут быть изменены только классы Caller и Callable. , первоначальный вызов должен оставаться неизменным. Я бы предпочел не go с exe c или eval, если это вообще возможно.

class Caller(object):
    def __init__(self, **kwargs):
        super(Caller, self).__init__()
        self.klass = kwargs.get('klass', None)
        self.func = kwargs.get('func', None)
        self.klassParams = kwargs.get('klassParams', None)

    def call(self):
        klass = self.klass(**self.klassParams)

        # Call the function
        someFunc = self.func
        klass.someFunc()

class Callable(object):
    def __init__(self, **kwargs):
        super(Callable, self).__init__()

    def someFunction():
        pass

c = Caller(klass=Callable, func=someFunction, klassParams={'some':'param'})
c.call()

Это, очевидно, потерпит неудачу с NameError: name 'someFunction' is not defined

1 Ответ

1 голос
/ 21 февраля 2020

Вы можете использовать функцию getattr bulit в python, вот как вы можете ее использовать,

getattr (object, name [, default])

Вернуть значение названного атрибута объекта. имя должно быть строкой. Если строка является именем одного из атрибутов объекта, результатом является значение этого атрибута. Например, getattr (x, 'foobar') эквивалентен x.foobar. Если указанный атрибут не существует, возвращается значение по умолчанию, если оно предоставлено, в противном случае вызывается AttributeError.

Я сделал довольно много исправлений в вашем коде, поэтому теперь код будет работать нормально,

class Caller(object):
    def __init__(self, parent=None, **kwargs):
        # Calling object class constructor doesn't take the argument name parent as its the base class in python
        super(Caller, self).__init__()
        self.klass = kwargs.get('klass', None)
        self.func = kwargs.get('func', None)
        self.klassParams = kwargs.get('klassParams', None)

    def call(self):
        klass = self.klass(**self.klassParams)

        # Call the function
        someFunc = self.func
        getattr(klass, someFunc)()

class Callable(object):
    def __init__(self, some=None, parent=None):
        # Calling object class constructor doesn't take the argument name parent as its the base class in python
        super(Callable, self).__init__()

    def someFunction(self):
        print("someFunction called by Caller")
        pass

# You have to pass the string representating the name of function to be called, in this case pass `'someFunction'`    
c = Caller(klass=Callable, func='someFunction', klassParams={'some':'param'})
c.call()

Вывод будет,

someFunction called by Caller
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...