#python #python-class
Вопрос:
Я только начинаю работать с кваргами в классах python, и я уверен, что это тривиальный вопрос, но я не могу найти достаточного ответа в Интернете.
У меня есть класс со значениями конфигурации, которые используются во многих функциях, однако есть некоторые вызовы, в которых значение должно быть отменено
Вот упрощенная версия моей проблемы с контекстом многословия:
Мои требования таковы:
- подробный становится значением конфигурации, если не указано иное
test().func() -> "Verbose = True"
- подробный становится кваргом, передаваемым классу при инициализации.
test(verbose=False).func() -> "Verbose = False"
- подробный становится кваргом, передаваемым функции при вызове функции.
test().func(verbose=False) -> "Verbose = False"
- (необязательно, но не обязательно жертвовать даже дополнительной линией сложности):
подробный становится конфигурацией даже без инициализации
test.func() -> "Verbose = True"
Мое Решение:
class test():
CONFIG = {"verbose":True}
def __init__(self,**kwargs):
self.__dict__.update(self.CONFIG)
self.__dict__.update(**kwargs)
def func(self=None,**kwargs):
verbose = kwargs['verbose'] if 'verbose' in kwargs else self.verbose
print(f"Verbose = {verbose}")
моя проблема:
Это не кажется правильным способом решения проблемы. Это кажется запутанным способом справиться с этим, и мне кажется, что есть встроенное или стандартное решение, которого мне не хватает. Еще большая проблема заключается в том, что мне не нравится, что я должен делать такую строку для каждой переменной и в каждой функции, с которой я хочу так обращаться.
Спасибо
Ответ №1:
Вы можете использовать get()
метод по умолчанию.
def funct(self, **kwargs):
verbose = kwargs.get('verbose', self.verbose)
print(f"Verbose = {verbose}")
Кстати, нет необходимости в значении по умолчанию для self
, так как этот аргумент всегда автоматически передается методам.
Комментарии:
1. Спасибо. Когда вы имеете в виду отсутствие необходимости в значении по умолчанию для self, вы имеете в виду self=Нет? Я часто пишу свои методы таким образом, чтобы я мог вызывать их, не инициируя класс(для использования в аналогичных проектах). Таким образом,при определении метода def 1(self=None, arg1):, вы можете вызвать его с помощью class1.method1(arg1). Я никогда не видел этого нигде, кроме своего собственного кода. как вы думаете, это непрактично или неправильно?
2. Да,именно это я и имел в виду. Я также не видел этой закономерности. Если метод не нуждается в
self
аргументе, он должен быть определен как@staticmethod
или@classmethod
.
Ответ №2:
Я верю, что это то, что вы ищете:
class test():
# A class variable will act as a default value for objects.
verbose = True
def __init__(self,**kwargs):
# It's better to use setattr. Modifying __dict__ might bypass some
# important automated stuff.
for k, v in kwargs.items():
setattr(self, k, v)
# self must not be None. 'None.verbose' is an error.
def func(self, **kwargs):
# Use the get method when the value might not be in the dict.
verbose = kwargs.get('verbose', self.verbose)
print(f"Verbose = {verbose}")
Комментарии:
1. Спасибо и за это, это именно то, что я искал.