在 python 中使对象可调用的语法
Syntax for making objects callable in python
我知道在 python 中,用户定义的对象可以通过在 class 定义中定义 __call__()
方法来调用。例如,
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"
我正在研究 pytorch
如何使 nn.Module
对象的 forward()
方法在调用对象时被隐式调用,并看到一些我不理解的语法。
在据称定义 __call__
方法的 the line 中,使用的语法是,
__call__ : Callable[..., Any] = _call_impl
这似乎是注释(:
之后的关键字 Callable[
被 python 忽略)和我们希望在以下情况下调用的值 _call_impl
的组合__call__
被调用,我猜这是一个 shorthand for,
def __call__(self, *args, **kwargs):
return self._call_impl(*args, **kwargs)
但想清楚地了解这种定义函数的方法是如何工作的。
我的问题是:我们什么时候要使用 class 的可调用属性的定义而不是通常的 def myfunc(self, *args, **kwargs)
函数是 python 中的普通 first-class 对象。您用来定义函数对象的名称,例如def
语句不是一成不变的,就像 int
或 list
一样。尽你所能
a = [1, 2, 3]
b = a
通过名称b
访问a
的元素,你可以用函数做同样的事情。在您的第一个示例中,您可以替换
def __call__(self, input1):
self.my_function(input1)
更简单
__call__ = my_function
您需要将此行放在 my_function
的定义之后。
这两种实现的主要区别在于 def __call__(...
创建了一个新函数。 __call__ = ...
只是将名称 __call__
绑定到与 my_function
相同的对象。明显的区别在于,如果您执行 __call__.__name__
,第一个版本将显示 __call__
,而第二个版本将显示 my_function
,因为这是由 def
语句分配的内容。
我知道在 python 中,用户定义的对象可以通过在 class 定义中定义 __call__()
方法来调用。例如,
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"
我正在研究 pytorch
如何使 nn.Module
对象的 forward()
方法在调用对象时被隐式调用,并看到一些我不理解的语法。
在据称定义 __call__
方法的 the line 中,使用的语法是,
__call__ : Callable[..., Any] = _call_impl
这似乎是注释(:
之后的关键字 Callable[
被 python 忽略)和我们希望在以下情况下调用的值 _call_impl
的组合__call__
被调用,我猜这是一个 shorthand for,
def __call__(self, *args, **kwargs):
return self._call_impl(*args, **kwargs)
但想清楚地了解这种定义函数的方法是如何工作的。
我的问题是:我们什么时候要使用 class 的可调用属性的定义而不是通常的 def myfunc(self, *args, **kwargs)
函数是 python 中的普通 first-class 对象。您用来定义函数对象的名称,例如def
语句不是一成不变的,就像 int
或 list
一样。尽你所能
a = [1, 2, 3]
b = a
通过名称b
访问a
的元素,你可以用函数做同样的事情。在您的第一个示例中,您可以替换
def __call__(self, input1):
self.my_function(input1)
更简单
__call__ = my_function
您需要将此行放在 my_function
的定义之后。
这两种实现的主要区别在于 def __call__(...
创建了一个新函数。 __call__ = ...
只是将名称 __call__
绑定到与 my_function
相同的对象。明显的区别在于,如果您执行 __call__.__name__
,第一个版本将显示 __call__
,而第二个版本将显示 my_function
,因为这是由 def
语句分配的内容。