分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 前端开发

metaclass

发布时间:2023-09-06 01:46责任编辑:彭小芳关键词:classmeta

代码:

class MyType(type): ???def __init__(self, *args, **kwargs): ???????super(MyType, self).__init__(*args, **kwargs) ???def __call__(self, *args, **kwargs): ???????obj = self.__new__(self, *args, **kwargs) ???????obj.__init__(*args, **kwargs) ???????return objclass Foo(object, metaclass=MyType): ???def __init__(self): ???????print(‘xxx‘)obj = Foo()print(obj)

结果

xxx<__main__.Foo object at 0x0000022688A07EB8>

  

我们看下面的代码

new

class Foo(object): ???def __init__(self): ???????return ‘init‘ ???def __new__(cls, *args, **kwargs): ???????return ‘new‘obj = Foo()print(obj)

结果 :new

class Foo(object): ???def __init__(self): ???????return ‘init‘ ???def __new__(cls, *args, **kwargs): ???????return cls.__init__(cls)obj = Foo()print(obj)

结果 init

由此可以看出 实例化对象的过程,__new__()比__init__()先执行

但是 实际上,在这次“”交♂易“”之前还走了一个中间商 那就是type的__call__(),但是我们并看不到__claa__()的源码。

类的metaclass 默认是type。

class MyType(type): ???def __call__(self, *args, **kwargs): ???????return ‘MyType‘class Foo(object, metaclass=MyType): ???def __init__(self): ???????return ‘init‘ ???def __new__(cls, *args, **kwargs): ???????return cls.__init__(cls) ???def __call__(self, *args, **kwargs): ???????return ‘call‘obj = Foo()print(obj)

结果:MyType

扩展参考:https://www.jianshu.com/p/ad976b494486

metaclass

原文地址:https://www.cnblogs.com/0bug/p/8578747.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved