атрибут класса Python3 по умолчанию для метода в том же классе - PullRequest
1 голос
/ 27 мая 2019
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()

**** SOLUTION (что я и сделал) ****

в main.py:

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

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

Ответы [ 2 ]

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

Ваш код, выполняющий присваивание в области видимости класса, будет работать, если вы не используете 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 голосов
/ 27 мая 2019

Вы можете установить значение по умолчанию в методе __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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...