__call__()
据我了解,在 python 中,可以通过在类定义中定义方法来使用户定义的对象可调用。例如,
class MyClass:
def __init__(self):
pass
def __call__(self, input1):
self.my_function(input1)
def my_function(self, input1):
print(f"MyClass - print {input1}")
my_obj = MyClass()
# same as calling my_obj.my_function("haha")
my_obj("haha") # prints "MyClass - print haha"
Run Code Online (Sandbox Code Playgroud)
我正在研究如何在调用对象时隐式调用对象的方法pytorch
,并看到一些我不理解的语法。forward()
nn.Module
在据称定义方法的行__call__
中,所使用的语法是:
__call__ : Callable[..., Any] = _call_impl
Run Code Online (Sandbox Code Playgroud)
这看起来像是一个注释(Python 忽略Callable[
后面的关键字)和一个我们希望在调用时调用的值的组合,我的猜测是这是一个简写,:
_call_impl
__call__
def __call__(self, *args, **kwargs):
return self._call_impl(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
但想清楚地了解这种定义函数的方法是如何工作的。
我的问题是:我们什么时候想使用类的可调用属性的定义而不是通常的定义def myfunc(self, *args, **kwargs)
函数是Python中普通的一等对象。定义函数对象的名称(例如使用语句)def
并不是一成不变的,就像int
or一样list
。正如你能做的那样
a = [1, 2, 3]
b = a
Run Code Online (Sandbox Code Playgroud)
a
要通过名称访问 的元素b
,您可以对函数执行相同的操作。在第一个示例中,您可以替换
def __call__(self, input1):
self.my_function(input1)
Run Code Online (Sandbox Code Playgroud)
与更简单的
__call__ = my_function
Run Code Online (Sandbox Code Playgroud)
您需要将此行放在 的定义之后my_function
。
两种实现之间的主要区别在于def __call__(...
创建了一个新函数。__call__ = ...
只是将名称绑定__call__
到与 相同的对象my_function
。明显的区别是,如果这样做__call__.__name__
,第一个版本将显示__call__
,而第二个版本将显示my_function
,因为这是由语句分配的内容def
。
归档时间: |
|
查看次数: |
812 次 |
最近记录: |