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
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
Ваш код, выполняющий присваивание в области видимости класса, будет работать, если вы не используете 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
).
Похожие вопросы
Новые вопросы
python-3.x
По вопросам программирования Python, относящегося к версии языка 3+. Используйте более общий тег [python] для всех вопросов Python и добавляйте его только в том случае, если ваш вопрос зависит от версии. Используйте теги [python-2.x] для вопросов Python 2.