zoukankan      html  css  js  c++  java
  • 2019.9.3学习整理

    2019.9.3学习整理

    什么是元类

    • 在python中一切皆对象,那么我们用class关键字定义的类本身也是一个对象,负责产生该对象的类称之为元类,即元类可以简称为类的类
    • Person类也是个对象,那他一定是由一个类实例化得到,这个类,就叫元类
    • type是内置的一个元类,所有的类都是由type实例化得到

    为什么用元类

    元类是负责产生类的,所以我们学习元类或者自定义元类的目的:是为了控制类的产生过程,还可以控制对象的产生过程

    class 关键字底层实现原理

    class 底层就是调用type来实例化产生类(对象)

    #class 类名   会把类构造出来
    #实际上是:元类实例化产生类  这个对象
    #类实例化产生对象,一定是:   类名()
    #Person  类是由type实例化产生,传一堆参数
    #type()  调用类的__init__方法
    # type()
    #type(object_or_name, bases, dict)
    # object_or_name:类的名字,是个字符串
    #bases:是它的所有父类,基类
    #dict:名称空间,是一个字典
    
    
    l={}
    exec ('''
    school='oldboy'
    def __init__(self):
        self.name=name
    def score(self):
        print('100')
    ''',{},l)
    
    Person=type('Person',(object,),l)
    print(Person.__dict__)
    print(Person.__bases__)
    

    通过元类控制类的产生

    自定义元类;来控制类的产生:可以控制类名,可以控制类的继承父类,控制类的名称空间

    自定义元类必须继承type,写一个类继承type 这种类都叫元类

    class Mymeta(type):
    
        def __init__(self,name,bases,dic):
            print(self.__dict__['__doc__'])
            doc=self.__dict__['__doc__']
            if not doc.strip():
                raise Exception('你的类没有加注释')
    
    
    
    # metaclass=Mymeta  指定这个类生成的时候,用自己写的Mymeta这个元类
    class sb_Person(object, metaclass=Mymeta):
        '''
        注释
        '''
        school = 'oldboy'
    
        def __init__(self, name):
            self.name = name
    
        def score(self):
            print('分数是100')
    
    

    通过元类控制类的调用过程

    控制类的调用过程,实际上在控制:对象的产生

    class Mymeta(type):
        def __call__(self, *args, **kwargs):
            # print('xxx')
    
            return 1
    
    class Person(object,metaclass=Mymeta):
        school='oldboy'
        def __init__(self,name):
            self.name=name
    
        def score(self):
            print('分数是100')
    
    p=Person('nick')
    print(p.name)
    
  • 相关阅读:
    Linux平台下快速搭建FTP服务器
    CentOS7添加/删除用户和用户组
    Centos7上安装Nginx两种方法
    Centos7 yum安装tomcat
    Centos7下查看端口占用
    Centos7开放及查看端口
    ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
    连接mysql数据库时提示2003 can't connect to MySQL server on ip(10060)的解决办法
    CentOS7 在线安装jdk8
    MySQL全方位练习(学生表 教师表 课程表 分数表)
  • 原文地址:https://www.cnblogs.com/zhangmingyong/p/11455183.html
Copyright © 2011-2022 走看看