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方法创建

  • 相关阅读:
    tuple 元组及字典dict
    day 49 css属性补充浮动 属性定位 抽屉作业
    day48 选择器(基本、层级 、属性) css属性
    day47 列表 表单 css初识
    day 46 http和html
    day 45索引
    day 44 练习题讲解 多表查询
    day 40 多表查询 子查询
    day39 表之间的关联关系、 补充 表操作总结 where 、group by、
    day38 数据类型 约束条件
  • 原文地址:https://www.cnblogs.com/Zhao01/p/10083303.html
Copyright © 2011-2022 走看看