zoukankan      html  css  js  c++  java
  • python中动态创建类

    class Foo(Bar):
        pass
    

    Foo中有__metaclass__这个属性吗?如果是,Python会在内存中通过__metaclass__创建一个名字为Foo的类对象(我说的是类对象,请紧跟我的思路)。如果Python没有找到__metaclass__,它会继续在Bar(父类)中寻找__metaclass__属性,并尝试做和前面同样的操作。如果Python在任何父类中都找不到__metaclass__,它就会在模块层次中去寻找__metaclass__,并尝试做同样的操作。如果还是找不到__metaclass__,Python就会用内置的type来创建这个类对象。

    类也是对象,在Python中,我们可以动态的创建类 1、在函数内部,需要类时动态创建 2、使用type内建函数 3、使用一个魔法方法 metaclass

    (一)

    函数内部,在分支语句中创建类函数使用

    def stu(name):
        if name == 'foo':
            class Foo:
                print('我是Foo...%s'%name)
        else:
            class XFoo:
                print('我是XFoo...我被错误的创建了%s'%name)
    
    stu('foo')
    stu(123)
    

    以上就是用于检验引用函数时传入的参数是否合理

    (二)

    type内建函数

    #创建无属性 无继承的类
    Foo = type('Foo',(),{})
    print(Foo)
    
    #创建有属性 无继承类
    Foo = type('Foo',(),{'name':'zhu'})
    print(Foo.name)
    
    #创建有属性,有继承类
    class Foo:
        name = 'zhu'
    
    FooChild = type('FooChild',(Foo,),{'age':19})
    print(FooChild.name,FooChild.age)
    
    #创建带方法的类
    def select(self):
        print(self.name)
    
    class Foo:
        name = 'zhu'
    
    FooChild = type('FooChild',(Foo,),{'age':19,'select':select})
    print(FooChild.name,FooChild.age,FooChild.select)
    fooChild = FooChild()
    fooChild.select()
    

    type()参数有三个,第一个是新建的类名,第二个是继承的父类,是一个元组,第三个是类具有的属性和方法,是一个字典,键是属性名或者方法名

    (三)

    使用魔法方法创建类 metaclass

    def upper_attr(future_class_name, future_class_parents, future_class_attr):
        # 遍历属性字典,把不是__开头的属性名字变为大写
        newAttr = {}
        for name, value in future_class_attr.items():
            if not name.startswith("__"):
                newAttr[name.upper()] = value
    
        # 调用type来创建一个类
        return type(future_class_name, future_class_parents, newAttr)
    
    
    class Foo(object, metaclass=upper_attr):
        bar = 'bip'
    
    
    print(hasattr(Foo, 'bar'))
    print(hasattr(Foo, 'BAR'))
    

    __mataclass__是为了创建元类而存在,如果类的tree中有,就会调用此方法,如果没有就会使用type方法创建

  • 相关阅读:
    Codeforces 1301F Super Jaber (多源bfs)
    分治法 实现归并排序
    分治法 解决最大字段和问题
    JS 禁用页面右键菜单
    泛型类型参数的限制: where使用方法
    JavaScript ReferenceError: Can’t find variable: __doPostBack
    EF 真分页
    EF 中 IEnumberable<> 和 IQueryable的区别
    C++ 字符串处理 重要函数
    Response.Redirect 导致 Session 丢失 Don't redirect after setting a Session variable
  • 原文地址:https://www.cnblogs.com/Zhao01/p/10083303.html
Copyright © 2011-2022 走看看