美文网首页
python面向对象思想的最深处——元类

python面向对象思想的最深处——元类

作者: Python之战 | 来源:发表于2019-03-23 23:17 被阅读0次

    在Python中一切皆对象,对象是实例化的类,而类的背后就是元类,如果说类创造了实例化对象,那么元类就创造了类,元类是类的抽象,这就是元类的概念。

    如何看一个类的类,我们可以通过class属性追溯,实例化当前对象的类,也可以追溯创建当前类的类。

    a = 3
    a.__class__
    <class 'int'>
    a.__class__.__class__
    <class 'type'>
    b = [1, 2]
    b.__class__
    <class 'list'>
    b.__class__.__class__
    <class 'type'>
    
    

    通过对实例化对象的追溯,我们可以看到int类型是实例化类是int创建的,int的创建对象是type,那么也就是Python中所有对象的元类都是type,都是通过type来创建的的。

    那么我们就该知道为什么type可以获得一个实例化对象的类型,但是却不推荐我们使用type来求证一个对象的类型,因为type是对传入对象的一次实例化得到一个类,这个类是创造这个实例化对象的中间类,它代表了这个实例化对象的类型。

    a = 3
    a.__class__
    <class 'int'>
    type(a)
    <class 'int'>
    
    

    这就是为什么一个对象使用class可以获得他的类型,同样使用type()也可以获得他的类型,一个是追溯,一个是元类实例化。

    那么如何使用元类创建类?这就需要type,创建方式是type(类名, 由父类名称组成的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))

    def a(self):
        print("实例化方法")
    
    @classmethod
    def b(cls):
        print("类方法")
    
    @staticmethod
    def c():
        print("静态方法")
    
    test = type("Test", (), {'a':a, 'b' :b, 'c': c, "name" :'class'})
    test.b()
    类方法
    test.c()
    静态方法
    test.name
    'class'
    test.__class__
    <class 'type'>
    
    d = test()
    d.a()
    实例化方法
    d.b()
    类方法
    d.c()
    静态方法
    d.name
    'class'
    
    

    上面代码演示了通过type创建一个类test,并添加类属性和方法,然后实例化该类得到a。

    type是Python内建属性,它是用于默认情况下创建类,但是还有另一种情况,自定义元类,自定义元类可以是函数或者类,他们都是对type的二次封装。

    我们定义的类,他的实现过程是首先看metaclass属性,存在该属性,那么通过这个属性的值来创建类,如果不存在那么将寻找父类中的metaclass属性来创建类,如果父类也没有,那么将调用内建的type创建类。

    image

    相关文章

      网友评论

          本文标题:python面向对象思想的最深处——元类

          本文链接:https://www.haomeiwen.com/subject/crzevqtx.html