#python #python-3.x #class #methods
#python #python-3.x #класс #методы
Вопрос:
У меня есть некоторый код на Python, который работает, но мой подход очень утомителен. Основная структура заключается в том, что у меня есть класс, который обрабатывает данные с помощью нескольких методов и возвращает обработанные данные. Структура кода выглядит следующим образом:
class ExampleClass:
def __init__(self):
self.__data = 0
def __AllCalculation(self,arg1=1,arg2=2):
self.__Calc1(arg1)
self.__Calc2(arg2)
def __Calc1(self,arg1):
self.__data arg1
def __Calc2(self,arg2):
self.__data arg2
def GetResults(self,arg1=1,arg2=2):
self.__AllCalculation(arg1,arg2)
return self.__data
и пользователь должен только вызывать GetResults()
. Существует ли более питонический подход к каскадированию аргументов через функции? Этот подход работает, но его сложно поддерживать, поскольку для одного изменения требуется несколько перезаписей. В идеале, если возможно GetResults()
наследовать аргументы от __AllCalculations()
включения значений по умолчанию.
Комментарии:
1. есть ли у вас несколько типов вычислений, которые необходимо выполнять в разных обстоятельствах? Например, у вас есть
calc1, calc2, calc3
, и вам может понадобитьсяgetresults1
, который вызывает 1 и 2, аgetresults2
который вызывает 2 и 32. С другой стороны, возможно, нет необходимости отделять
getresults
от__allcalculation
.3. @jrmylow Да, есть вероятность, что у меня будет другой
getresults
вариант, который пропустит некоторые вычисления. Я знаю, что простое удалениеgetresults
и__AllCalculation
прямое использование решило бы проблему, но вопрос все еще остается в силе; возможно ли распространять аргументы?4. Если вы достаточно дисциплинированы, использование
**kwargs
может помочь5. @jrmylow не могли бы вы привести пример того, как распространять и отслеживать его? Я не могу понять, как
GetResults(**kwargs)
мы собираемся показать, каковы значения по умолчанию__AllCalculations
, и передать эту информацию при использовании функции.
Ответ №1:
Я полагаю, что вы просите, чтобы функция top (GetResults) знала, какие аргументы ей нужно передать по цепочке. Используя текущий метод построения функций, вы убедитесь, что сигнатура каждой функции содержит все переменные, которые она передает. Как вы упомянули, это утомительно поддерживать.
Используя **kwargs
, вы можете получить метод для извлечения аргументов ключевого слова, которые ему необходимы для работы, и отбросить остальные. Это возлагает ответственность на функции / методы в конце цепочки, чтобы решить, что им нужно **kwargs
.
class ExampleClass:
def __init__(self):
self.__data = 0
def __AllCalculation(self, **kwargs):
self.__Calc1(**kwargs)
self.__Calc2(**kwargs)
def __Calc1(self, arg1, **kwargs):
self.__data = arg1
def __Calc2(self, arg2, **kwargs):
self.__data = arg2
def GetResults(self, **kwargs):
self.__AllCalculation(**kwargs)
return self.__data
A = ExampleClass()
print(A.GetResults(arg2 = 3, arg1 = 5, arg3 = 1000)) # Prints 8 = 0 5 3
Тогда возникает вопрос: как мне узнать, какие аргументы мне нужно передать в начале? Если вы вызываете функцию без указания требуемого аргумента, вы поднимете TypeError
, указав, какой именно аргумент ключевого слова вам нужно передать. (По общему признанию, вам может потребоваться вызвать его несколько раз, чтобы перехватить все, но, по крайней мере, вам нужно изменить его только в одном месте)