zoukankan      html  css  js  c++  java
  • Python—元类

    什么是元类?

    元类是类的类,是类的模板

    元类是用来控制如何创建类的,正如类是创建对象的模板一样,而元类的主要目的是为了控制类的创建行为

    元类的实例化的结果为我们用class定义的类,正如类的实例为对象(f1对象是Foo类的一个实例,Foo类是 type 类的一个实例)

    type是python的一个内建元类,用来直接控制生成类,python中任何class定义的类其实都是type类实例化的对象

    方式一:使用class关键字

    class Chinese(object):
        country='China'
        def __init__(self,name,age):
            self.name=name
            self.age=age
        def talk(self):
            print('%s is talking' %self.name)

    方式二:就是手动模拟class创建类的过程):将创建类的步骤拆分开,手动去创建

    #准备工作:
    
    #创建类主要分为三部分
    
      1 类名
    
      2 类的父类
    
      3 类体
    
    
    #类名
    class_name='Chinese'
    #类的父类
    class_bases=(object,)
    #类体
    class_body="""
    country='China'
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def talk(self):
        print('%s is talking' %self.name)
    """

    步骤一(先处理类体->名称空间):类体定义的名字都会存放于类的名称空间中(一个局部的名称空间),我们可以事先定义一个空字典,然后用exec去执行类体的代码(exec产生名称空间的过程与真正的class过程类似,只是后者会将__开头的属性变形),生成类的局部名称空间,即填充字典

    class_dic={}
    exec(class_body,globals(),class_dic)

    步骤二:调用元类type(也可以自定义)来产生类Chinense

    Foo=type(class_name,class_bases,class_dic) #实例化type得到对象Foo,即我们用class定义的类Foo
    
    
    print(Foo)
    print(type(Foo))
    print(isinstance(Foo,type))
    '''
    <class '__main__.Chinese'>
    <class 'type'>
    True
    '''

    我们看到,type 接收三个参数:

    • 第 1 个参数是字符串 ‘Foo’,表示类名
    • 第 2 个参数是元组 (object, ),表示所有的父类
    • 第 3 个参数是字典,这里是一个空字典,表示没有定义属性和方法

    补充:若Foo类有继承,即class Foo(Bar):.... 则等同于type('Foo',(Bar,),{})

     
     
  • 相关阅读:
    算法导论
    深度探索C++对象模型
    git 介绍及其使用总结
    前端跨域常见的几种方式
    前端面试angular 常问问题总结
    低版本浏览器支持HTML5标签的方法
    理解 angular 的路由功能
    Angular 新手容易碰到的坑
    Angular 新手容易碰到的坑
    一 Unicode和UTF-8的异同
  • 原文地址:https://www.cnblogs.com/zivli/p/9906414.html
Copyright © 2011-2022 走看看