你如何在Python中调用类的实例?

Aar*_*all 25 python class call

这是受到我刚刚看到的一个问题的启发,"通过调用类实例来更改返回的内容",但很快得到了回答__repr__(并且被接受,因此提问者实际上并不打算调用该实例).

现在调用类的实例可以这样做:

instance_of_object = object() 
instance_of_object()
Run Code Online (Sandbox Code Playgroud)

但我们会得到一个错误,比如TypeError: 'object' object is not callable.

此行为在此处的CPython 源中定义.

所以为了确保我们在Stackoverflow上有这个问题:

你如何在Python中实际调用类的实例?

Aar*_*all 45

您可以调用类的实例,如下所示:

o = object() # create our instance
o() # call the instance
Run Code Online (Sandbox Code Playgroud)

但这通常会给我们一个错误.

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'object' object is not callable
Run Code Online (Sandbox Code Playgroud)

我们如何按预期调用实例,并从中获得一些有用的东西?

我们必须实现Python特殊方法,__call__!

class Knight(object):
    def __call__(self, foo, bar, baz=None):
        print(foo)
        print(bar)
        print(bar)
        print(bar)
        print(baz)
Run Code Online (Sandbox Code Playgroud)

实例化类:

a_knight = Knight()
Run Code Online (Sandbox Code Playgroud)

现在我们可以调用类实例:

a_knight('ni!', 'ichi', 'pitang-zoom-boing!')
Run Code Online (Sandbox Code Playgroud)

打印:

ni!
ichi
ichi
ichi
pitang-zoom-boing!
Run Code Online (Sandbox Code Playgroud)

我们现在已经成功地称之为班级的一个实例!