Инициализация переменной класса с массивом функций класса

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

class A:
    def b(self):
        pass

    def c(self):
        pass

    d = [A.b, A.c]

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

1 ответ

Решение

Вы не можете использовать 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)
Другие вопросы по тегам