我试图理解Python中的“可调用对象”是什么,以及类可调用的含义。我在玩以下代码:
class A(object):
def __init__(self):
pass
print("Is A callable? " + str(callable(A)))
a=A()
print("created a")
a()
Run Code Online (Sandbox Code Playgroud)
得到以下结果:
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
Run Code Online (Sandbox Code Playgroud)
此外,
print(type(A.__call__()))
Run Code Online (Sandbox Code Playgroud)
给出:
<class '__main__.A'>
Run Code Online (Sandbox Code Playgroud)
这是否意味着A类具有__call__方法?为什么是class类?
A.__call__()每次使用A()实例化时都会被调用吗?
因此,从以下事实开始:在Python中,通常函数是可调用的,而类是可调用的。如您所知,除了将将函数标记为可调用的机制之外,Python类还具有特殊的方法。使类的实例可调用的方法是__call__。因此,如果您的类具有显式__call__方法,则其实例是可调用的,并且故事结束:当您调用实例时,将调用该__call__方法。
回答了您一半的问题-现在让我们检查__call__ 类的方法的作用。
Python中的类本身也是第一类对象-但它们必须是type 的实例。也就是说,type像调用一个类一样创建一个实例,创建一个new class。当代码中遇到类主体块时,Python运行时会自动执行此操作。(但是,也可以通过以其3+参数形式显式调用type来以编程方式创建新类)
由于type其本身是-的子类,因此object它的 __new__方法具有特殊性,因为它创建了一个新类,并按照cPython ABI的要求填充了所有需要的数据结构,分配了内存,并将值放入了纯净不可访问的字段中Python代码。由于它是Python中任何类型的类对象的类,因此称为metaclas。可以从类型派生其他类并创建自定义元类,以在创建类时运行代码,插入属性,注册数据等,但这是可选的。创建的任何类都通过type的__new__。
当您实例化课程时?我在上面写过,使对象在Python中可调用的原因是__call__其类中存在方法。type作为所有类的类,它确实具有一种__call__方法-并包含编排对该类__new__和__init__方法的调用所需的代码。这就是为什么类是可调用的,也是Python为什么可以对函数调用和对象实例化使用相同的语法的原因。
A.__call__()每次使用A()实例化时都会被调用吗?
不正确-所谓的是type(A).__call__。A.__call__并且type(A).__call__如果在中没有__call__定义任何显式方法,A则该方法将是相同的(然后type搜索其类__call__。但是特殊方法不会被普通属性检索由Python隐式调用:它们始终是从对象的类中选取的,并且是在内部创建的运行时。
您可能会为元类的调用不适用于该类而感到困惑:这根本没有像Python的方法检索算法中那样定义。当您请求对象的属性或方法(包括类似的特殊方法)时__call__,将以描述符(以提供自定义属性访问)的形式在该类中搜索该属性-然后搜索该类的基类,但不该课程的课程。(此外,对于特殊方法,仅当它们在对象的类本身中定义时,它们才是特殊的:直接附加到实例上无效)。
所有发布的关键文档是Python的数据模型 -但是可能需要一些时间并尝试从中找出所有内容。
| 归档时间: |
|
| 查看次数: |
2460 次 |
| 最近记录: |