我可以在不重写代码的情况下更改Python对象的调用吗?
在伪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
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。