java有与python __call__等价的东西吗?

时间:2013-03-18 10:43:44

标签: java python

刚开始学习python,我遇到了__call__方法。我了解何时调用__init__以及通过运行一个简单示例调用__call__时:

class Constructor:
    def __init__(self, a):
        print "__init__ called"

    def __call__(self):
        print "__call__ called"

    def dummy(self):
        print "a dummy method called"

print "creating x obj"
x = Constructor(1)
print "calling x object"
x()

控制台输出:

creating x obj
__init__ called
calling x object
__call__ called

我的问题是:

  1. 我来自java背景,我知道__init__映射到java构造函数,java是否等同于__call__以帮助我更好地理解这一点?
  2. 有人能给我一个简单的例子说明__call__何时有用?

2 个答案:

答案 0 :(得分:5)

__call__等同于在类上重载()运算符。这在C ++中是可能的,但不是Java。它允许拥有功能对象(有时称为仿函数)。

在Python中,这些被称为可调用对象

简单来说,这允许您将对象视为函数。

这些概念的实际用途超出了本答案的范围,但互联网上有大量信息。例如Wikipedia

答案 1 :(得分:3)

不,Java中没有像__call__这样的东西。您不能将对象用作方法调用。你必须创建一个方法并调用它:

class Constructor{
    Constructor(){
        System.out.println("Constructor called");
    }

    void doStuff(){
        System.out.println("do called");
    }

    public static void main(String[] args){
        System.out.println("Creatng x obj");
        x = new Constuctor();
        System.out.println("Calling x obj");
        x.doStuff();
    }
}