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

如何在Python中让类对象可调用?Python3自定义可调用类实现方案

让Python类实例具备可调用性的方法

嘿,这个问题问到点子上了!其实Python里让类实例能像函数一样直接被调用的核心,就是利用**__call__魔法方法**——这也是PyTorch模型能通过mod(input)直接计算预测结果的底层原理。

一、如何让类对象具备可调用性?

在Python中,当你对一个实例使用()进行调用时,解释器会自动寻找并执行该类中的__call__方法。所以只要在你的类里定义这个方法,实例就拥有了可调用性。

__call__方法可以接受任意数量的参数,就像普通函数一样,你可以在里面编写需要执行的逻辑,最后返回结果即可。

二、修改你的MLP类,支持直接调用实例

针对你提供的MLP代码,我们只需要新增一个__call__方法,把原本predict方法的逻辑复用进去(或者直接把逻辑写在__call__里),就能实现obj(input)的调用方式了。

修改后的完整代码如下:

import numpy as np
class MLP:
    def __init__(self, hidden_units: int, input_size: int):
        self.hidden_units = hidden_units
        self.input_size = input_size
        self.layer1 = np.random.normal(0, 0.01, size=(hidden_units, input_size))
        self.layer2 = np.random.normal(0, 0.01, size=(1, hidden_units))
    def sigmoid(self, z):
        return 1/(1 + np.exp(-z))
    def predict(self, input):
        pred = self.layer1.dot(input)
        pred = self.layer2.dot(pred)
        return self.sigmoid(pred)
    # 新增__call__方法,让实例可以直接被调用
    def __call__(self, input):
        # 复用predict的逻辑,避免重复代码
        return self.predict(input)

# 实例化类
my_MLP = MLP(5, 10)
# 现在两种调用方式都支持
# 方式1:原有的方法调用
pred1 = my_MLP.predict(np.random.normal(0, 0.01, 10))
# 方式2:直接调用实例,和PyTorch模型用法一致
pred2 = my_MLP(np.random.normal(0, 0.01, 10))

扩展:支持多参数调用

如果需要像obj(in1, in2, in3)这样传入多个参数,只需要在__call__方法里定义对应参数即可,比如:

def __call__(self, in1, in2, in3):
    # 这里编写多参数的运算逻辑
    intermediate = in1 + in2 * in3
    return self.sigmoid(self.layer1.dot(intermediate))

这样你的实例就可以接受多个输入参数并执行运算啦!

内容的提问来源于stack exchange,提问作者Álvaro F. b.f.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 11:02:26