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

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

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

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

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 Ответ

0 голосов
/ 28 марта 2019

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

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))
...