【问题标题】:How to pass arguments through multiple methods如何通过多种方法传递参数
【发布时间】:2020-09-18 14:27:45
【问题描述】:

我有一些 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()。是否有更 Pythonic 的方法来通过函数级联参数?这种方法有效但难以维护,因为单个更改需要多次重写。理想情况下,GetResults() 可以从 __AllCalculations() 继承参数,包括默认值。

【问题讨论】:

  • 您是否有多种类型的计算需要在不同的情况下进行?例如。你有calc1, calc2, calc3,你可能需要调用1和2的getresults1和调用2和3的getresults2
  • 单独考虑,可能没有必要将getresults__allcalculation 分开。
  • @jrmylow 是的,我有可能拥有不同的getresults,它会跳过一些计算。我知道只需删除getresults 并直接使用__AllCalculation 即可解决问题,但问题仍然存在;是否可以传播论点?
  • 如果你足够自律,使用**kwargs 可能会成功
  • @jrmylow 你能提供一个如何传播和跟踪它的例子吗?我无法理解GetResults(**kwargs) 将如何显示__AllCalculations 中的默认值并在使用该函数时传达该信息。

标签: python python-3.x class methods


【解决方案1】:

我相信您要求的是顶级函数 (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,准确指定您需要传递的关键字参数。 (诚​​然,您可能需要调用几次才能捕获所有内容,但至少您只需要在一个地方进行更改)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-15
    • 2015-07-06
    • 1970-01-01
    • 2016-02-24
    • 2016-04-26
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    相关资源
    最近更新 更多