我可以在不重写代码的情况下更改Python对象的调用吗?

我可以在不重写代码的情况下更改Python对象的调用吗?,python,python-3.x,class,Python,Python 3.x,Class,在伪python代码中考虑以下场景: class Component_i:#与i=1,2,3相同,。。。 __调用(自我,输入): 返回输入 类别MyClass: 定义初始化(自): self.comp_1=组件_1() self.comp_2=组件_2() self.comp_3=组件_3() 定义调用(自我,输入): 返回自我补偿3(自我补偿2(自我补偿1(输入))) A=MyClass() 现在我想做以下几点: class组件_2B: __调用(self,input,option=Tru

在伪python代码中考虑以下场景:

class Component_i:#与i=1,2,3相同,。。。
__调用(自我,输入):
返回输入
类别MyClass:
定义初始化(自):
self.comp_1=组件_1()
self.comp_2=组件_2()
self.comp_3=组件_3()
定义调用(自我,输入):
返回自我补偿3(自我补偿2(自我补偿1(输入)))
A=MyClass()
现在我想做以下几点:

class组件_2B:
__调用(self,input,option=True):
如果选择:
返回输入
其他:
返回带有输入的do_stuff_(输入)
A.comp_2=组件_2B()
然后我想更改A的
\uuu调用
,以同时接受可选输入
选项
,并且无论何时调用该可选输入都将传递给
A.comp\u 2
。但是为了使事情复杂化,我想在不重写
\uuuu调用的情况下实现这个

有人有主意吗


这里是一个MWE:

class MultiplyWithParameter:
def _u初始(自身,参数:浮点):
self.p=参数
定义调用(自,输入:浮点):
返回self.p*输入
类ProcessDataClass:
def _u初始(自身,参数:浮点):
self.mul=MultiplyWithParameter(参数)
定义调用(自,输入:浮点):
输入=输入*5+4
输入=self.mul(输入)
返回输入-3
DataProcessor=ProcessDataClass(2.5)
类OptionalMultiplyWithParameter:
def _u初始(自身,参数:浮点):
self.p=参数
定义调用(self,输入:float,乘法:Bool=True):
如果乘以:
返回self.p*输入
其他:
返回输入
现在我要开始了

DataProcessor.mul=OptionalMultiplyWithParameter(DataProcessor.mul.p)
并使用数据处理器(4.23,False)
。这将在调用期间将
False
传递给
DataProcessor.mul
。我希望这样做,而不必重写
ProcessDataClass
\uuuuuuuuuuuu调用(否则将很简单)


以下是一些动机:


假设internet上有一个名为
coollibrary
的包,我想从中使用函数
coolclassfactory
。此函数返回
CoolClass
的一个实例,该实例具有一系列属性和一个
\uuuu调用。它的某些属性可能属于类
ProcessWithParameters
。初始化时,
CoolClass
从Internet加载参数。现在我想把我用
coolclassfactory
构建的
CoolClass
实例作为
MyClass
的一个属性。但是我想用另一个类
OptionalProcessWithParameters
替换我的
CoolClass
实例拥有的以及属于类
ProcessWithParameters
的所有属性,这基本上允许在运行时选择两种可能的方法来处理带参数的输入。因为这个运行时选项是新的,所以我必须在调用过程中添加它(我想?-这很重要,在多处理中使用它应该是安全的!)。现在不幸的是,因为我使用了
coolclassfactory
,这返回了
coolclassfactory
的许多可能的子类中的一个,每个子类都有一个单独的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu调用
,我不能简单地重写
\uuuu。基本上,我必须重写
CoolClass
子类的所有调用,我正试图避免这些调用…

您始终可以对任何类进行子类化,并根据您的喜好重写/扩展/调整原始类的任何部分,并使用access原始功能

根据您的示例,类似于以下示例:

class ProcessDataClassOptional(ProcessDataClass):
    def __init__(self, parameter: float):
        super().__init__(parameter) #use the original init to do its thing
        self._mul = OptionalMultiplyWithParameter(parameter) #our modification

    def __call__(self, input: float, multiply: Bool = True):
        self.mul = lambda x: self._mul(x, multiply) # now the original will use our modify mul
        return super().__call__(input)
现在您可以使用调整后的版本

DataProcessor = ProcessDataClassOptional(2.5)
DataProcessor(4.23)
DataProcessor(4.23, False)

当作为原始类使用时,不应该有任何更改,但是现在您也可以使用新的行为了

如果您开始使用名称序列编写类,那么您可能会遇到一个很大的设计问题。@klaud。这是伪代码…伪代码导致对问题的伪理解,从而导致伪答案。尽量用实际代码给出一个最小的工作示例。好啊我添加了一个MWE。