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