zoukankan      html  css  js  c++  java
  • python_元类

    一、引导

    class Demo:
        def func(self):
            pass
    
    obj = Demo()
    print(type(obj))  
    print(type(Demo)) # Demo = type()
    
    # 所有你写的类默认情况下都是type产生的
    # 产生的类称之为 元类!! 即type就是元类
    
    # 类的三大特征:
    1.类名
    2.父类
    3.类的名称空间

    eval与exec

    res = """
    print('555')
    """
    res2 = """
    for i in range(5):
        print(i)
    """
    
    eval(res) # 555
    exec(res) # 555
    eval(res2) # 报错
    exec(res2) # 1 2 3 4 5
    
    # 从上面执行的结果可以得知:
    #  eval与exec都可以识别字符串中代码并执行,但是eval不支持逻辑性代码

    二、不依赖class关键字创建类

    如何产生一个类:

    # 上面说类由:类名、父类、类的名称空间组成
    
    class_name = 'User'   # 类名
    class_base = (object,)   # 父类,注意必须是元组,逗号不能忘
    #类的名称空间:类体代码
    res = """
    school = "oldboy"
    def __init__(self):
        self.name = name
    def func():
        pass
    """
    
    class_attrs = {}
    exec(res,{},class_attrs) # 将res执行产生的名称空间放到class_attrs中
    # class_global(中间)一般情况下都为空,除非在字符串代码内部用global关键字声明,才会将产生的名字丢到class_global全局名称空间中
    print(class_attrs)
    # {'school': 'oldboy', '__init__': <function __init__ at 0x0000000001D02EA0>, 'func': <function func at 0x00000000027DDE18>}
    # 调用元类创建自定义类
    User = type(class_name,class_bases,class_attrs) #传参:将类名、父类、类的名称空间丢给type产生 print(User) #<class '__main__.User'>

    # 它可以访问自身的属性和方法,并实例化产生对象 print(User.school) #oldboy obj = User('Simon') print(obj.name) # Simon print(obj) # <__main__.User object at 0x0000000001E7CF98>

     三、自定义元类控制类的创建过程

    class MymetaClass(type):  # 必须是继承了type的类才是自定义元类
        def __call__(self, *args, **kwargs):
            # 1.先创建一个对象的名称空间  __new__
            # 2.往改名称空间中丢一堆名字  __init__
            # 3.产生好的对象返回出去
    
            # 1.产生一个空对象
            obj = self.__new__(self)
            # 2.实例化该对象
            self.__init__(obj, *args, **kwargs)
            # 3.返回该对象
            return obj
            # return super().__call__(*args,**kwargs)
    class Demo(metaclass=MymetaClass):  # 指定Demo的元类是MymetaClass
        pass
    obj = Demo()
    print(obj)  # <__main__.Demo object at 0x00000000027EC898>
    print(type(obj)) # <class '__main__.Demo'>
    # 标准可以直接参照这个使用
    #
    表名 主键 一对字段 class MemetaClass(type): # def __new__(cls, class_name,class_bases,class_attrs): if class_name == 'Userinfo': raise TypeError('我不想鸟你') if 'school' in class_attrs: class_attrs['school'] = 'xx最大线上xx开业啦' class_attrs['table_name'] = 'userinfo' class_attrs['primary_key'] = 'id' return type.__new__(cls,class_name,class_bases,class_attrs) class User(object,metaclass=MemetaClass): # 通过metaclass可以指定类的元类 school = 'oldboy' print(User.__dict__) """ {'__module__': '__main__', 'school': 'xx最大线上xx开业啦', 'table_name': 'userinfo', 'primary_key': 'id', '__dict__': <attribute '__dict__' of 'User' objects>, '__weakref__': <attribute '__weakref__' of 'User' objects>, '__doc__': None} """

    最详细的方法:https://www.cnblogs.com/Dominic-Ji/p/10520256.html

  • 相关阅读:
    my first android test
    VVVVVVVVVV
    my first android test
    my first android test
    my first android test
    ini文件
    ZZZZ
    Standard Exception Classes in Python 1.5
    Python Module of the Week Python Module of the Week
    my first android test
  • 原文地址:https://www.cnblogs.com/yangmeichong/p/10959315.html
Copyright © 2011-2022 走看看