• 面向对象-元类介绍


    储备知识exec
    参数1:字符串形式的命令
    参数2:全局作用域(字典形式),如果不指定默认就使用globals()
    参数3:局部作用域(字典形式)如果不指定默认就使用locals()

    g={
        'x':1,
        'y':2
    }
    l={}
    
    exec("""
    global x,m
    x=10
    m=100
    
    z=3
    """,g,l)
    print(g)
    print(l)
    print(g)
    一切皆对象,对象可以怎么用?
    1、被引用,x=obj
    2、都可以当做函数的参数传入
    3、都可以当做函数的返回值
    4、都可以当做容器类的元素,l=[func,time,obj,1]

    类也是对象,查看类型,type
    class Foo:
        pass
    
    obj=Foo()
    print(type(obj))
    print(type(Foo))
    
    class Bar:
        pass
    
    print(type(Bar))
    产生类的类称之为元类,默认所有用class定义的类,他们的元类都是type
    方式一:class
    class Chinese:
        country='China'
    
        def __init__(self,name,age):
            self.name=name
            self.age=age
    
        def talk(self):
            print('%s is talking'%self.name)
    # print(Chinese)
    obj=Chinese('egon',18)
    print(obj,obj.name,obj.age)
    方式二:type
    定义类的三要素:类名,类的基类,类的名称空间
    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)
    """
    
    class_dic={}
    exec(class_body,globals(),class_dic)
    print(class_dic)
    
    Chinese1=type(class_name,class_bases,class_dic)
    # print(Chinese1)
    obj1=Chinese1('egon',18)
    print(obj1,obj1.name,obj1.age)
    如何定制元类 来控制类的行为
    class Mymeta(type):
        def __init__(self,class_name,class_bases,class_dic):
            print(class_name)
            print(class_bases)
            print(class_dic)
            if not class_name.istitle():
                raise TypeError('类名的首字母必须大写')
    
            if '__doc__' not in class_dic or not class_dic['__doc__'].strip():
                raise TypeError('必须有注释,且注释不能为空')
    
            super(Mymeta,self).__init__(class_name,class_bases,class_dic)
    
    class Chinese(object,metaclass=Mymeta):
        """
        注释
        """
        country='China'
    
        def __init__(self,name,age):
            self.name=name
            self.age=age
    
        def talk(self):
            print('%s is talking'%self.name)
    
    # Chinese=type(class_name,class_bases,class_dic)
     


  • 相关阅读:
    angular-utils-pagination 使用案例
    解决mongodb ISODate相差8小时问题
    Android HttpClient POST JSON Restful-web-services
    将Map转换为Java 对象
    request.getParameterMap()
    angular-fullstack test
    oracle insert &字符插入问题
    listview底部增加按钮
    IDE 常用快捷键记录
    一个jQuery扩展工具包
  • 原文地址:https://www.cnblogs.com/hexiaorui123/p/10201544.html
Copyright © 2020-2023  润新知