Python—在类实例化期间根据用户输入选择函数或alter模块

Python—在类实例化期间根据用户输入选择函数或alter模块,python,function,class,module,return,Python,Function,Class,Module,Return,我认为发布这个问题的一个最小的工作示例可能会很混乱,所以我将使用伪代码概述这个问题。我有一个模块,我在其中定义了一个类——让我们称它为my_class.py。类方法使用了大量类似的代码,因此将这些代码块分解为函数并将它们放入单独的模块是有意义的——我们称之为functions.py。为了澄清,functions.py如下所示: def dependent(inverted): if inverted: return this else: retu

我认为发布这个问题的一个最小的工作示例可能会很混乱,所以我将使用伪代码概述这个问题。我有一个模块,我在其中定义了一个类——让我们称它为my_class.py。类方法使用了大量类似的代码,因此将这些代码块分解为函数并将它们放入单独的模块是有意义的——我们称之为functions.py。为了澄清,functions.py如下所示:

def dependent(inverted):
    if inverted:
        return this
    else: 
        return that

def func_a():
    do stuff...
    dependent()

def func_b():
    dependent()
    do stuff...

... more functions ...

def func_z()
    do stuff...
    dependent()
from functions import func_a, func_b, func_c

class A():
    def __init__(self, inverted=False):
        self.inverted = inverted

    def method_1(self,):
         do stuff....
         func_a()
         do sfuff ...
         func_b()

    def method_2(self,):
        func_c()

    ... more methods using functions from functions.py
def method_1(self):
    do stuff...
    func_a(self.inverted)
    ...
def func_a(inverted):
    do stuff...
    dependent(inverted)
我的_class.py如下所示:

def dependent(inverted):
    if inverted:
        return this
    else: 
        return that

def func_a():
    do stuff...
    dependent()

def func_b():
    dependent()
    do stuff...

... more functions ...

def func_z()
    do stuff...
    dependent()
from functions import func_a, func_b, func_c

class A():
    def __init__(self, inverted=False):
        self.inverted = inverted

    def method_1(self,):
         do stuff....
         func_a()
         do sfuff ...
         func_b()

    def method_2(self,):
        func_c()

    ... more methods using functions from functions.py
def method_1(self):
    do stuff...
    func_a(self.inverted)
    ...
def func_a(inverted):
    do stuff...
    dependent(inverted)
现在,您可能看到functions.py中奇怪的“dependent”函数和类init方法中的“inversed”关键字。你看,函数func_a,func_b,functions.py中的func_z也重用了许多相同的代码,所以我将这些代码放在一个名为dependent的函数中,因为函数func_a、func_b等都依赖于它

事情看起来很平淡,但后来我注意到我需要考虑的一个拐角案件。使用名为“inversed”的布尔变量很容易解释这种情况。用户应该指定在实例化类时问题是否颠倒了。问题是,唯一直接改变的函数是从属函数。其他函数func_a、func_b等将间接更改,因为它们依赖于“dependent”。注意,该类实际上从不调用“dependent”,只调用func_a、func_b等

我想我可能把自己画进了一个角落。我想不出一个干净的方法来改变或传递倒置的选项到“dependent”函数,从类到所说的类正在导入的模块。事实上,这一过程似乎是循环和愚蠢的

我想到了两种解决办法

1) 将self.inversed传递给func_a、func_b、…、func_z。因此,方法如下所示:

def dependent(inverted):
    if inverted:
        return this
    else: 
        return that

def func_a():
    do stuff...
    dependent()

def func_b():
    dependent()
    do stuff...

... more functions ...

def func_z()
    do stuff...
    dependent()
from functions import func_a, func_b, func_c

class A():
    def __init__(self, inverted=False):
        self.inverted = inverted

    def method_1(self,):
         do stuff....
         func_a()
         do sfuff ...
         func_b()

    def method_2(self,):
        func_c()

    ... more methods using functions from functions.py
def method_1(self):
    do stuff...
    func_a(self.inverted)
    ...
def func_a(inverted):
    do stuff...
    dependent(inverted)
func_a,func_b,等等,看起来像这样:

def dependent(inverted):
    if inverted:
        return this
    else: 
        return that

def func_a():
    do stuff...
    dependent()

def func_b():
    dependent()
    do stuff...

... more functions ...

def func_z()
    do stuff...
    dependent()
from functions import func_a, func_b, func_c

class A():
    def __init__(self, inverted=False):
        self.inverted = inverted

    def method_1(self,):
         do stuff....
         func_a()
         do sfuff ...
         func_b()

    def method_2(self,):
        func_c()

    ... more methods using functions from functions.py
def method_1(self):
    do stuff...
    func_a(self.inverted)
    ...
def func_a(inverted):
    do stuff...
    dependent(inverted)
或2)创建两个功能模块,唯一的区别是一个将dependent设置为返回该,另一个将dependent设置为返回该(倒过来的情况)。然后,类init方法将基于反向参数导入相应的函数模块。视觉上:

class A():
    def __init__(self, inverted=False):
        if inverted:
            from functions_inverted.py import func_a, func_b, ...
        else:
            from functions_normal.py import func_a, func_b, ...
我不喜欢这两种选择,因为我重复了很多代码,这有点违背了使代码模块化和干净的初衷。如果我早些时候注意到这个角落的情况,我可能会采取不同的方法,但是,在这一点上,已经花费了大量的时间使代码达到其当前状态

是否有更好的解决方案—保持代码模块化和干净—以便在类实例化期间提供该选项时,仅通过将选项传递给函数“dependent”来更改functions.py中的所有函数?请注意,可以同时调用/运行该类的多个实例


谢谢

鉴于最后的要求

请注意,可以同时调用/运行该类的多个实例

您可以将所有函数包装在一个类中(它们成为方法),并将
倒置
作为传递给该类的每个实例的参数。然后在每个实例上设置
self.inversed
\uuuu init\uuuu
,并在运行依赖函数(从该实例)时进行检查

看起来您已经在不需要的更高级别上完成了这项工作。您可以只实例化实用程序类和其中的函数,并将函数调用改为使用实例的方法