0

我创建了一个类,构造函数中的每个(仅关键字)参数对应于特定的类方法。我还定义了另一种按顺序执行这些类方法的方法。我希望此方法按照在构造函数中给出相应参数的顺序执行其他方法,但我不确定如何执行此操作。

我的实际代码相当复杂,所以我在下面提供了一个简单但等效的示例来说明我的意思。

我创建了类并定义了如下方法:

class thing:
    
    def __init__(self,
                 add_value=1,
                 subtract_value=2,
                 divide_value=3):
        
        self.add_no=add_value
        self.subtract_no=subtract_value
        self.divide_no=divide_value
        
        self.function_list = [
            self.do_addition,
            self.do_subtraction,
            self.do_division]
        
    def do_addition(self, input_no):
        return input_no + self.add_no
        
    def do_subtraction(self, input_no):
        return input_no - self.subtract_no
        
    def do_division(self, input_no):
        return input_no / self.divide_no
        
    def do_thing(self, input_no):
        for i in range(len(self.function_list)):
            function = self.function_list[i]
            output_no = function(input_no)
            input_no = output_no
        return output_no

如果我然后初始化一个类对象:

my_thing = thing(add_value=3,
                 subtract_value=1,
                 divide_value=2)

并运行该do_thing方法:

my_thing.do_thing(10)

6.0正如预期的那样,输出是。当然,输出将取决于do_additiondo_subtractiondo_division方法的执行顺序。我想知道是否有一种方法可以按照构造函数中给出的顺序执行这些方法,以便返回以下内容7.5(而不是6.0):

my_thing_2 = thing(subtract_value=1,
                   divide_value=2,
                   add_value=3)

我对 Python 中的课程很陌生,所以我将不胜感激!提前致谢。

4

1 回答 1

0

我设法找到了一种符合问题意图的解决方法,即使严格来说它不是答案。

这涉及向order最终方法do_thingcalculate在下面的代码中重命名)添加一个参数,它允许用户指定类方法的操作顺序。

构造function_list函数自动创建属性并按字母顺序对其中的函数进行排序。

class thing:
    
    def __init__(self,
                 add_value=None,
                 subtract_value=None,
                 divide_value=None):
        
        self.add_no=add_value
        self.subtract_no=subtract_value
        self.divide_no=divide_value
        
        function_names = sorted([f for f in dir(self) 
                               if callable(getattr(self, f)) 
                               and f.startswith("do_")],
                              key=lambda f: f.lower())
        self.function_list = [getattr(self, i) for i in function_names]

    def do_addition(self, input_no):
        if self.add_no is not None:
            return input_no + self.add_no
        else:
            return input_no
        
    def do_subtraction(self, input_no):
        if self.add_no is not None:        
            return input_no - self.subtract_no
        else:
            return input_no
            
    def do_division(self, input_no):
        if self.add_no is not None:        
            return input_no / self.divide_no
        else:
            return input_no
            
    def calculate(self, input_no, order=None):
        if order:
            op_order = order
        else:
            op_order =range(len(self.function_list))
        for i in op_order:
            function = self.function_list[i]
            output_no = function(input_no)
            input_no = output_no
        return output_no

这至少给出了一个特定的顺序,然后可以使用 in 中的order参数进行更改calculate。所以像以前一样初始化类对象:

my_thing = thing(add_value=3,
                 subtract_value=1,
                 divide_value=2)

我们得到一个对象,它像这样对方法进行排序: (0) do_addition ->(1) do_division ->(2) do_subtraction,我们可以通过calculate像这样传递参数来改变这个顺序:

my_thing.calculate(10,order=[2,1,0])

根据需要返回7.5

同样,因为初始化时构造函数中 kwargs 的实际顺序没有给出顺序,所以这不是我问题的答案。但是,这是获得所需结果的一种方法,因此我将其发布在这里以供将来参考!

于 2020-11-16T10:03:36.867 回答