如何在Python中定义可被多个类复用的函数?
在Python中定义可复用给多个类的函数
当然可以实现,你之前的操作之所以无效,是因为直接将实例方法赋值给其他对象时,方法已经和原实例绑定,调用时self指向的是原solvers实例,而非目标blob实例。以下是几种可行的解决方案:
方案1:使用独立普通函数
把要复用的函数定义为独立的普通函数,Python会在它作为方法被调用时,自动将调用它的实例作为第一个self参数传入:
def Euler(self): # 注意修正原代码的错误:N需要是self.N self.N += self.dNdt(self.N) * self.dt class blob: # 可以直接在类中把函数设为方法 solver = Euler def __init__(self): self.N = 0 self.dt = 0.1 def dNdt(self, N): return 2 * N # 示例实现 # 实例化后直接调用 blob1 = blob() blob1.solver() print(blob1.N) # 输出0.2,正确修改blob1的N值
也可以动态给单个实例赋值:
blob2 = blob() blob2.solver = Euler blob2.solver()
方案2:使用Mixin混合类
这是Python中复用类方法的标准方式,定义一个仅提供复用方法的Mixin类,让需要的类继承它:
class SolverMixin: def Euler(self): self.N += self.dNdt(self.N) * self.dt class blob(SolverMixin): def __init__(self): self.N = 0 self.dt = 0.1 def dNdt(self, N): return 2 * N blob1 = blob() blob1.Euler() print(blob1.N) # 输出0.2
这种方式的优势是可以一次性给多个类添加同一组方法,代码结构更清晰。
方案3:手动绑定方法到实例
如果需要从已有类的方法中复用,可借助types.MethodType将未绑定的函数手动绑定到目标实例:
import types class solvers: def Euler(self): self.N += self.dNdt(self.N) * self.dt class blob: def __init__(self): self.N = 0 self.dt = 0.1 def dNdt(self, N): return 2 * N methods = solvers() blob1 = blob() # 获取未绑定的函数对象,再绑定到blob1 blob1.solver = types.MethodType(methods.Euler.__func__, blob1) blob1.solver() print(blob1.N) # 输出0.2
内容的提问来源于stack exchange,提问作者Gowzahr
相关产品推荐
相关产品推荐

