Инициализация переменной класса с массивом функций класса - PullRequest
0 голосов
/ 06 декабря 2018

Я хотел бы создать массив функций-членов в качестве переменной класса, чтобы я мог переключаться по всему классу и т. Д. Следующее не работает

class A:
    def b(self):
        pass

    def c(self):
        pass

    d = [A.b, A.c]

, потому что A еще не создан.Есть ли обходной путь для этого?Мне удалось подумать о двух: 1) инициализировать переменную класса в __init__, что мне не нравится, потому что это приведет к ее повторной инициализации с каждым созданным объектом;и 2) создать его как глобальную переменную, которая мне тоже не нравится, так как она используется только внутри класса и поэтому должна быть переменной класса.

1 Ответ

0 голосов
/ 06 декабря 2018

Вы не можете использовать A.b, поскольку, как вы говорите, A еще не определено.Но вы можете выбрать функции по их именам непосредственно из пространства имен:

class A:
    def b(self):
        pass

    def c(self):
        pass

    d = [b, c]

Однако это вам не поможет, потому что теперь у вас есть список несвязанных методов:

>>> A().d[0]()
TypeError: b() missing 1 required positional argument: 'self'

Если вы хотите список связанных методов (где self неявно передается в качестве текущего экземпляра), вам нужно будет создать этот список, когда у вас есть фактический экземпляр:

class A:
    def __init__(self):
        self.d = [self.b, self.c]

    ...

В качестве альтернативы вам необходимо явно передать self несвязанному методу:

class A:
    ...

    d = [b, c]

    def foo(self):
        self.d[0](self)
...