【python 笔记】元类中的__call__方法

本文探讨了Python元类中__call__方法的使用,解释了元类的__new__和__call__的区别。通过代码示例展示了如何在元类中改写这两个方法,以及它们对类和实例创建的影响。总结指出元类__new__用于创建类,__call__则用于实例化。当__call__返回非`type.__call__(cls, *args, **kwargs)`时,会阻止类的__init__和方法执行。" 56668086,153816,将exe程序转换为Windows服务:nssm与AlwaysUp对比,"['Windows开发', '系统服务', '软件部署', '程序包装']
摘要由CSDN通过智能技术生成

【python 笔记】元类中的__call__方法

 

在学到用metaclass实现单例时,发现用的是元类的__call__方法,而不是__new__方法。对元类__call__比较疑惑,看起来似乎和普通类的__call__不一样。学习之后,一些基础的总结如下。

 

先是一些基本的概念等

 

  • 元类是类的类,元类之于类就相当于类之于实例。
  • 元类的new方法会创建一个类并返回,就像类的new方法会创建一个实例并返回一样。
  • 元类中其他方法的定义类似于类中方法的定义。
  • __call__方法是元类中有一个特殊的方法。

 

在元类方法中,参数cls对应的对象:

class Meta(type): 
    def __new__(cls, name, bases, dct):  # cls为元类Meta
        return type.__new__(cls, name, bases, dct)
    def __init__(cls, *args, **kwargs):  # cls为元类创建的类
        pass
    def __call__(cls, *args, **kwargs):  # cls为元类创建的类
        pass

 

对元类__new__、__call__的分析

 

Code1:元类 改写__new__方法

class SingletonType(type):
    def __new__(cls, class_name, class_parents, class_attr):  # cls为元类
        print('元类__new__')
        return type(class_name, class_parents, class_attr)

    def __init__(cls, *args, **kwargs):  #cls为元类创建的类
        print('元类__init__&
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值