Я хочу передать аргумент по умолчанию методу экземпляра, используя значение атрибута экземпляра:
class C:
def __init__(self, format):
self.format = format
def process(self, formatting=self.format):
print(formatting)
При попытке этого я получаю следующее сообщение об ошибке:
NameError: name 'self' is not defined
Я хочу, чтобы метод вел себя следующим образом:
C("abc").process() # prints "abc"
C("abc").process("xyz") # prints "xyz"
В чем проблема, почему это не работает? И как я могу заставить это работать?
Вместо того, чтобы создать список если-thens, которые охватывают Ваше значение по умолчанию arguements, можно использовать словарь 'значений по умолчанию' и создать новые экземпляры класса при помощи оценки ():
class foo():
def __init__(self,arg):
self.arg = arg
class bar():
def __init__(self,*args,**kwargs):
#default values are given in a dictionary
defaults = {'foo1':'foo()','foo2':'foo()'}
for key in defaults.keys():
#if key is passed through kwargs, use that value of that key
if key in kwargs: setattr(self,key,kwargs[key])
#if no key is not passed through kwargs
#create a new instance of the default value
else: setattr(self,key, eval(defaults[key]))
я бросаю это в начале каждого класса, который инстанцирует другого класса как параметра по умолчанию. Это избегает Python, оценивая значение по умолчанию в компиляции... Я любил бы более чистый подход pythonic, но lo'.