zoukankan      html  css  js  c++  java
  • 面向对象-元类介绍

    储备知识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)
     


  • 相关阅读:
    PAIRING WORKFLOW MANAGER 1.0 WITH SHAREPOINT 2013
    Education resources from Microsoft
    upgrade to sql server 2012
    ULSViewer sharepoint 2013 log viewer
    Top 10 Most Valuable Microsoft SharePoint 2010 Books
    讨论 Setsockopt选项
    使用 Alchemy 技术编译 C 语言程序为 Flex 可调用的 SWC
    Nagle's algorithm
    Nagle算法 TCP_NODELAY和TCP_CORK
    Design issues Sending small data segments over TCP with Winsock
  • 原文地址:https://www.cnblogs.com/hexiaorui123/p/10201544.html
Copyright © 2011-2022 走看看