[英]__call__ method of type class
我从所有方面了解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__
函数如何出现吗?
任何类本身就是“类型”类型的实例-因此,“调用”一个类只是在其类上调用方法__call__
恰好是类型的__call__
。 type.__call__
的影响正好在以下代码上:
class A:
pass
b = A()
type.__call__
接收类A
本身作为其第一个参数。 A.__new__
在伪代码中,我们可以编写instace = A.__new__(cls)
作为运行内容。 __init__
( instance.__init__()
) return instance
但是,如果类本身是从“类型”派生的(即,它是“新”类的实例化),则需要采取额外的步骤: __class__
变量的特殊值将填充到任何类方法中-如果这些方法中的任何一个都使用对super
的调用。 在Python 3.6上,需要执行以下两个步骤:调用任何定义__set_name__
方法的类属性,并调用该类的__init_subclass__
方法。
记住, type
是一个元类,所以它的实例是类,而不是对象。 比(其中包括)意味着当您执行此操作时:
e= Employee(*args,**kwargs)
您正在调用Employee.__init__
以及元类中的某些方法,包括Meta.__call__
,方法与操作时相同。
print (e(10))
您正在调用自定义__call__
方法。
以这个Singleton
元类为例:
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
class MyClass(BaseClass):
__metaclass__ = Singleton
现在,每次创建MyClass
的新实例时,都会在创建实际实例之前 __call__
元类中的__call__
方法,从而使您可以检查先前的实例是否存在并返回该实例。
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.