Как передать значение аргумента по умолчанию члена экземпляра методу?

Я хочу передать аргумент по умолчанию методу экземпляра, используя значение атрибута экземпляра:

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"

В чем проблема, почему это не работает? И как я могу заставить это работать?

53
задан poke 1 January 2018 в 08:24
поделиться

1 ответ

Вместо того, чтобы создать список если-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'.

0
ответ дан 7 November 2019 в 08:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: