首页 > 编程语言 > 详细

python基础-面向对象(二十六)面向对象进阶(十四)元类(一),__new__,__init__

时间:2020-12-18 19:15:29      阅读:39      评论:0      收藏:0      [点我收藏+]

1.metaclass -- 元类

一种用于创建类的类。类定义包含类名、类字典和基类列表。元类负责接受上述三个参数并创建相应的类。大部分面向对象的编程语言都会提供一个默认实现。Python 的特别之处在于可以创建自定义元类。大部分用户永远不需要这个工具,但当需要出现时,元类可提供强大而优雅的解决方案。它们已被用于记录属性访问日志、添加线程安全性、跟踪对象创建、实现单例,以及其他许多任务。

默认情况下,类是使用 type() 来构建的。类体会在一个新的命名空间内执行,类名会被局部绑定到 type(name,bases, namespace) 的结果。

类创建过程可通过在定义行传入 metaclass 关键字参数,或是通过继承一个包含此参数的现有类来进行定制。在以下示例中,MyClass 和 MySubclass 都是 Meta 的实例:

class Meta(type):
    pass

class MyClass(metaclass=Meta):
    pass

class MySubclass(MyClass):
    pass

上面是官方解释,有些不好懂,看看究竟什么是元类

class Test(metaclass=type):
    pass


test = Test()
print(type(test)) #test的类是Test
print(type(Test)) #Test的类是type,说明Test是由type这个类实例化出来的

技术分享图片

 

 

 

 可以看出:元类就是用来实例化类的,是类的类,比如上面的Test类就是由系统自带的type实例化出来的。

2.如何用元类来实例化类,上面的是一种方式

class Test(metaclass=type)

第二种方式

def __init__(self, name):
    self.name = name


# type(object_or_name, bases, dict)
Test111 = type(Test, (object,), {x: 1, init: __init__})
print(Test111)
print(Test111.__dict__)

技术分享图片

 

 3.自定义元类

一般使用第一种方式,自定义元类,可以通过继承type,或是metaclass的方式自定义元类

class Mytype(object,metaclass=type):
    def __init__(self, *args, **kwargs):
        print(======>from Mytype __init__)
    def __new__(cls, *args, **kwargs):
        print(======>from Mytype __new__)
        print(args)  #Mytype(object_or_name, bases, dict)
        print(kwargs)
        obj=super().__new__(cls) #调用父类的new
        print(obj)
        # return obj


class Test(metaclass=Mytype): #Test=Mytype(Test)实例化 ,Mytype(object_or_name, bases, dict)
    #Mytype 调了Mytype.__new__
    def __init__(self):
        print(======>from Test__init)

技术分享图片

 

 

执行顺序。

 技术分享图片

 

 可以看出一旦执行元类,也就是实例化Test,会去执行元类Mytype的__new__,生成对象以后,再执行__init__。为什么会这么执行呢?因为执行了Mytype的元类中的__call__方法。请看下期

 

python基础-面向对象(二十六)面向对象进阶(十四)元类(一),__new__,__init__

原文:https://www.cnblogs.com/liaoyifu/p/14156134.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!