如何在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.
相关产品推荐
相关产品推荐

