class Test:
    func = self.func2 # default: func is func2 by default
    # tried Test.func2 as well and Pycharm shows error

    def __init__(self, func=None):
        if func is not None:
            self.func = func

    def func1(self):
        pass

    def func2(self):
        pass

Может кто-нибудь посоветовать, как добиться чего-то подобного выше?

Я попытался установить параметр func по умолчанию на func2 в конструкторе тоже, но это также ошибки.

Поэтому позже, где-нибудь в классе Test, я могу просто вызвать self.func вместо многократного выполнения условий, чтобы выяснить, следует ли использовать func1 или func2

self.func()

**** РЕШЕНИЕ (что я сделал) ****

В main.py:

t = Test(func=Test.func1)
t.func(t, **kwargs)

Это должно успешно вызвать t.func1 (или t.func2, если указано) с доступом к t instance_attributes посредством вызова метода более высокого порядка t.func

1
Loveen Dyall 27 Май 2019 в 18:32

2 ответа

Лучший ответ

Вы можете установить значение по умолчанию в методе __init__, основываясь на значении параметра func:

Может быть, что-то вроде этого:

class Test:

    def __init__(self, func=None):
        if func is None:
            self.func = self.func2
        else:
            self.func = func

    def func1():
        print('func1')

    def func2(self):
        print('func2')

Test().func()
Test(Test.func1).func()

< Сильный > выход:

func2
func1
0
Reblochon Masque 20 Июл 2019 в 00:39

Ваш код, выполняющий присваивание в области видимости класса, будет работать, если вы не используете self (который не определен) и переместите его в конец определений классов, чтобы func2 существовал в пространстве имен, когда он работает.

class Test:
    def __init__(self, func=None):
        if func is not None:
            self.func = func

    def func1():
        pass

    def func2():
        pass

    func = func2 # this will work down here

Я хотел бы отметить, что когда вы назначаете функцию переменной класса, она будет обрабатываться как метод, поэтому вам может потребоваться изменить func2, чтобы ожидать self в качестве первого аргумента. Поведение привязки не произойдет для методов, назначенных в качестве переменных экземпляра, как и для любого func, переданного в метод __init__. Если вы хотите привязать поведение к ним, вам нужно реализовать его самостоятельно (возможно, с functools.partial).

0
Blckknght 20 Июл 2019 в 00:50