繁体   English   中英

__call__类的方法

[英]__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()
  1. type.__call__接收类A本身作为其第一个参数。
  2. 它调用A.__new__在伪代码中,我们可以编写instace = A.__new__(cls)作为运行内容。
  3. 返回“ A”类的实例
  4. 然后它在实例上调用__init__instance.__init__()
  5. ...并返回该实例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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM