栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python 类的原理 与 metaclass

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python 类的原理 与 metaclass

class 实际上是继承于type
而构建一个type,需要三个东西,

  1. 类的名字
  2. 它的父类,tuple类型元组
  3. dict

type() 输入一个参数,返回的是参数的type
type() 输入三个参数,返回的是一个新的type

class A():
	pass
A = type("A",(),{})

以上两种写法是完全等价的。

为什么要引入__metaclass__?

因为type()直接调用到C函数里,我们没办法自定义一些中间的过程了。
所以提供给我们一个__metaclass__的方法,去定义中间的过程。

我们想做这样一件事,

class M(type):
	def __new__(cls, name, bases, dict):
		return type.__new__(cls, name, bases, dict)
A = M("A",(),{})

让M返回我需要的类。

用metaclass的写法重写一下

class M(type):
	def __new__(cls, name, bases, dict):
		return type.__new__(cls, name, bases, dict)
class A(metaclass = M):
	pass

M的__new__函数是在定义class A的时候执行的

其实还可以往metaclass里放一个__init__函数、一个__call__函数

__init__和__new__的区别就是,init的时候已经有A这个Object了

class M(type):
    def __new__(cls, name, bases, dict):
        return type.__new__(cls, name, bases, dict)
    def __init__(self, name, bases, dict):
        return type.__init__(self, name, bases, dict)
    def __call__(cls,*args,**kwargs):
        return type.__call__(cls, *args, **kwargs)

如果用super().代替type.
在__init__和__call__里需要把self,cls去掉
__new__里面不用去掉

单例模式快速实现

class M(type):
    def __call__(cls,*args,**kwargs):
        if hasattr(cls,"_instance"):
            return cls._instance
        cls._instance = type.__call__(cls, *args, **kwargs)
        return cls._instance
class A:
    __metaclass__ = M
    pass

print id(A())
print id(A())
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/938372.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号