gpt4 book ai didi

python - __call__ 类型类的方法

转载 作者:太空宇宙 更新时间:2023-11-04 00:35:40 25 4
gpt4 key购买 nike

根据我对 Python 面向对象编程的所有了解,如果一个类定义了 __call__ 方法,如果我们像函数调用一样使用该类的实例,该方法将被调用。例如:

class Employee:
def __init__(self,name,sal):
self.name = name
self.salary = sal
def __call__(self,value):
return self.salary * value

e = Employee("Subhayan",20000)
print (e(10))

所以 __call__ 方法将对象实例作为第一个参数。

我只是想了解 Python 中的元类,我读到 type 是所有用户定义类的默认元类。

如果我在 Python 中定义一个基本的自定义元类:

class Meta(type):
def __new__(meta, classname, supers, classdict):
# Run by inherited type.__call__
return type.__new__(meta, classname, supers, classdict)

现在根据书中给出的文档,元类 __new__ 方法将由继承自 type 的 __call__ 方法运行。

现在我的问题是要使用任何类的 __call__ 方法,我们必须拥有该类的对象,然后将其作为函数调用。

这里我们没有任何类型的对象来使用它的__call__函数。

谁能给我解释一下类型类的 __call__ 函数是如何出现的?

最佳答案

任何类本身都是类型“type”的实例 - 因此“调用”一个类只是调用其类上的方法 __call__ - 这恰好是类型的 __call__ .type.__call__ 的效果就是:代码如下:

class A:
pass
b = A()
  1. type.__call__ 接收类 A 本身作为其第一个参数。
  2. 它调用 A.__new__ - 在伪代码中我们可以编写 instace = A.__new__(cls) 来运行。
  3. 返回“A”类的一个实例
  4. 然后在实例上调用__init__(instance.__init__())
  5. ...并返回该实例 return instance

但是,如果类本身是从“类型”派生的 - 即它是"new"类的实例化,则需要采取额外的步骤:神奇的 __class__ 变量的特殊值填充在任何类方法中 - 如果这些方法中的任何一个使用对 super 的调用。在 Python 3.6 上,这两个进一步的步骤:调用定义 __set_name__ 方法的任何类属性,以及调用类的 __init_subclass__ 方法。

关于python - __call__ 类型类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44178162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com