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