Python 语法问题,实例化了一个对象后直接把这个对象当作一个函数调用,这是什么语法?算是函数式编程吗?

2019-04-19 01:41:34 +08:00
 Andy00

最近正在看 PyTorch,在 PyTorch 里看到了一种写法感觉很酷,但有点疑惑,遂来请教,感谢各位大佬答疑

在创建 PyTorch 的模型时会定义一个 class,这里是我抄来的代码:

class Encoder(nn.Module):

    def __init__(
            self,
            n_src_vocab, len_max_seq, d_word_vec,
            n_layers, n_head, d_k, d_v,
            d_model, d_inner, dropout=0.1):

        super().__init__()
        # 具体的函数逻辑我就删掉了,应该没有什么关系


    def forward(self, src_seq, src_pos, return_attns=False):

        # 具体的函数逻辑我就删掉了,应该没有什么关系

        return enc_output,

然后在另外的函数里初始化了这个类,给对象传入参数,代码如下:

encoder = Encoder(参数)
encoder(input_data)

按照我的理解这里在调用 encoder 时就相当于调用了 forward 函数,但是不需要用encoder.forward()这样的语法,请问这个叫什么?我该在搜什么关键词能找到这个语法?

3278 次点击
所在节点    Python
7 条回复
neoblackcap
2019-04-19 01:53:03 +08:00
不就是实现了__call__魔法方法而已
Andy00
2019-04-19 02:04:49 +08:00
@neoblackcap 感谢大佬,搜到了,搞明白了
13d1101
2019-04-19 07:55:02 +08:00
Python 里有“鸭子类型”这个概念,可以学习下
yph007595
2019-04-19 08:03:58 +08:00
还是加强一下基础吧,
Gakho
2019-04-19 11:00:44 +08:00
如果你多看一下 Python 的文档,你应该会知道 callable object 这个东西 [手动狗头]
kneep
2019-04-19 11:17:52 +08:00
callable 吧
xinXinDaWang
2019-04-19 11:21:05 +08:00
hh..

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/556628

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX