我正在努力了解' 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.__call__()
被调用
答案 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__
,否则它的实例将不会拥有它,因为它永远不会在类的类中查找。