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