Как настроить аргументы по умолчанию для методов класса в качестве переменных класса?

#python #class #keyword-argument

#python #класс #ключевое слово-аргумент

Вопрос:

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

 from copy import deepcopy


class Cat:
    def __init__(self):
        self.parameters = {'meow': {'volume': 10.2,
                                    'pitch': 'E'},
                           'sleep': {'duration': 100,
                                     'snore': True,
                                     'dream': True}}

    def meow(self, **kwargs):
        params = self._set_parameters('meow', kwargs)
        print('Meowing at {volume} dB in {pitch}'.format(**params))

    def sleep(self, **kwargs):
        params = self._set_parameters('sleep', kwargs)
        print('Sleeping for {duration} hours...n'
              'Snore: {snore}nDream: {dream}'.format(**params))

    def _set_parameters(self, action, kwargs):
        params = deepcopy(self.parameters[action])
        for key in kwargs:
            if key in params:
                params[key] = kwargs[key]
        return params
  

Здесь, когда метод класса вызывается без каких-либо параметров, if использует значения по умолчанию.

 Sleepycat = Cat()
Sleepycat.sleep()

>>> Sleeping for 100 hours...
    Snore: True
    Dream: True
  

Пользователь также может указать аргумент ключевого слова для переопределения значений по умолчанию:

 Loudcat = Cat()
Loudcat.meow(volume=100)

>>> Meowing at 100 dB in E
  

Ответ №1:

Как насчет этого

 class Cat:
    def __init__(self):
         self.sleep_duration = 100
         self.sleep_snore = True
         self.sleep_dream = True

    def sleep(self, 
              duration=100, 
              snore=True, 
              dream=True):
        self.sleep_duration = duration
        self.sleep_snore = snore
        self.sleep_dream = dream

        print('Sleeping for {0} hours...n'
              'Snore: {1}nDream: {2}'.format(
                self.sleep_duration, self.sleep_snore, self.sleep_dream))
  

Комментарии:

1. Это то, к чему я изначально стремился, но я думаю, что в этом больше избыточного кода. Вам нужно объявить все аргументы по умолчанию дважды, и когда у вас много методов класса и аргументов ключевых слов, это становится немного запутанным.