Python 3: Предоставление команды для установки атрибута self в __init__ с необходимостью использовать "self"?

Я знаю, что заголовок вопроса звучит странно, но поскольку английский не является моим родным языком, мне очень трудно формализоваться. Тем не менее, я мог бы объяснить это немного больше текста.

Проблема в том, что я пытаюсь создать класс с именем "Foo", например.

# ../myProject/Foo.py

class Foo:
    '''Represents an example class for stackru'''

Теперь все экземпляры класса Foo имеют function атрибут, который просто содержит функцию, которая может быть выполнена через экземпляр. Кроме того, есть parameters атрибут, кортеж или список, который содержит параметры, которые должны использоваться, когда function вызывается.

    def __init__(self, function, parameters):
        self.function = function
        self.parameters = parameters

    def callFunction(self):
        if self.function:
            self.function(*self.parameters)

Кажется, это работает нормально, но проблема в том, что я хочу присвоить ему значение по умолчанию, чтобы изменить атрибут экземпляра. Я в основном хочу сделать следующее:

def __init__(self, function=setattr, \
        parameters=(self, "togglableAttribute", not self.togglableAttribute)):

И это поднимет NameError: name 'self' is not defined, Как я должен реализовать это, чтобы это работало, или я должен придумать обходной путь?

1 ответ

Решение

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

Типичный способ сделать это - проверить дозорного;

def __init__(self, function=setattr, parameters=None):
    if parameters is None:
       parameters = (self, "togglableAttribute", not self.togglableAttribute)

Смотрите мой ответ здесь (и комментарии под ним) для обсуждения различных объектов, которые вы можете использовать в качестве стража, и различных плюсов и минусов каждого.

Другие вопросы по тегам