You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 02:23:15