Python - Class可以调用是什么意思?

时间:2018-01-26 13:08:41

标签: python callable

我正在努力了解' callables'是Python,以及类可以调用的含义。我正在使用以下代码:

class A(object):

    def __init__(self):
        pass

print("Is A callable? " + str(callable(A)))
a=A()
print("created a")
a()

这给出了以下结果:

Is A callable? True
created a
Traceback (most recent call last):    
File "test2.py", line 11, in <module>
a()
TypeError: 'A' object is not callable  

此外,

print(type(A.__call__()))

给出:

<class '__main__.A'>

这是否意味着A类有__call__方法?为什么它是类型类?

每当我用A()?

实例化时,

A.__call__()被调用

2 个答案:

答案 0 :(得分:4)

因此,从Python开始,通常函数是可调用的,并且类是可调用的。 抛开将函数标记为可调用的机制,正如您所知,Python类具有特殊方法。使类可调用的实例的方法是__call__。因此,如果您的类具有显式__call__方法,则其实例可调用且结束故事:当您调用实例时,它是被调用的__call__方法。

这回答了你的一半问题 - 现在让我们检查一下类的__call__方法是做什么的。

Python中的类本身也是一流的对象 - 但它们必须是类型的实例。也就是说,调用type作为一个调用类来创建实例,创建一个新的class。 Python运行时在代码中遇到类主体块时自动执行此操作。 (但也可以通过以三个+参数形式显式调用类型来创建新的类程序)

由于type本身是object的子类 - 它的__new__方法具有特殊性,因为它创建了一个新类,填满了所需的所有数据结构。 cPython ABI,分配内存,并将值放入无法从纯Python代码访问的字段中。因为它是Python中任何类对象的类,所以它被称为元字符。可以从类型派生其他类并创建自定义元类,在创建类时运行代码,插入属性,注册数据等等 - 但这是可选的。创建的任何类都经过类型__new__

当你实例化一个班级?我在上面写道,使Python中的对象可调用的原因是它的类中存在__call__方法。 type是所有类的类, __call__方法为特征 - 它包含编排对类__new__的调用所需的代码, __init__方法。这就是为什么类可以调用,以及为什么Python可以使用相同的语法进行函数调用和对象实例化。

  每当我用A()?

实例化时,

A.__call__()被调用

不正确 - 所谓的是type(A).__call__A.__call__type(A).__call__如果__call__中没有定义明确的A方法,那么type__call__将是相同的(然后在其__call__类中搜索if switch但是,普通的属性检索不会通过Python隐式调用特殊方法:它们总是从对象的类中挑选出来 - 这是在运行时内创建的。

你可能会因为元类'调用不可用于类而感到困惑:这种方法根本没有像Python中的方法检索算法那样定义。当你要求一个对象的属性或方法 - 包括一个特殊的方法,如StringBuilder时,该类将以描述符的形式搜索属性(以提供自定义属性访问) - 然后是该类的基类class,但不是该类的类。 (另外,对于特殊方法,只有在对象的类本身中定义它们时它们才是特殊的:直接附加到实例上没有效果。)

这是所有发布的关键文档是Python的Data Model - 它可能需要一些时间并尝试从那里找出所有内容。

答案 1 :(得分:2)

当调用对象的__something__方法时,会发生类似这样的事情:

  • 对象的类是否有它?如果是这样,请返回。
  • 它班级的超类是否拥有它?如果是这样,请返回。
  • 它的超类的超类是否拥有它?如果是这样,请返回。
  • ...

请注意,它永远不会查看对象的类的类。

由于类是type的实例(或其子类,请参阅here),因此类可以调用(type具有__call__)。但是,除非该类还定义了__call__,否则它的实例将不会拥有它,因为它永远不会在类的类中查找。