zoukankan      html  css  js  c++  java
  • Python动态构造类:借助强悍的内建 type()

    内建的 type() 函数带三个参数时, 将作为强悍的动态类构造器. 如下:

    type(name, bases, dict)
           返回一个新的type对象. 基本上是 class 语句的动态形式. 参数:
          name  , 字符串, 制定要构造类的名字, 赋给新对象的 __name__ 属性;
          bases,一个tuple,指定新类型的所有基类,赋给新对象的__bases__ 属性; 
          dict, 字典类型,作为新类的名字空间,赋给新对象的__dict__ 属性
    

    例如,下面两条语句作用完全一样:

    >>> class X(object):
    ... a = 1
    ...
    >>> X = type('X', (object,), dict(a=1))  
    

    以下是创建一个新类的通常做法:

    class Foo(object):  
        pass  
    

    而我们能够通过以下的代码达到同样的效果:

    Foo = type('Foo', (), {})  
    

    目前Foo是一个名为“Foo”的类的引用,这个名为“Foo”的类以object为基类(通过type创建的类,如果没有特别指定其基类,将会默认创建新类型的类)。

    这么做看起来非常棒,但如果我们需要向Foo中添加成员函数该怎么办呢?这很容易通过设置Foo的类属性办到:

    def always_false(self):  
        return False  
      
    Foo.always_false = always_false  
    

    上面的代码也可以这么写:

    Foo = type('Foo', (), {'always_false': always_false})  
    

    bases参数是Foo的基类列表,在上例中我们留空了,同时可以用type从Foo类创建一个新类:

    FooBar = type('FooBar', (Foo), {})  
    

    一种应用的场景:

    比如在CMDB里面会有多种manfiest设备类型,会有多种类型会有各种不一样的child方法。
    这样如果 需要创建多个父类的话可以传递一个变量进去就可以生成多个类。然后就可以继承
    可以节省不少的代码量.

  • 相关阅读:
    学习java annotation
    自己模拟实现spring IOC原理
    ubuntu16.04~qt 5.8无法输入中文
    尔雅小助手
    ubuntu16.04 python3 安装selenium及环境配置
    A flash of Joy
    数据库大作业--由python+flask
    flask+html selected 根据后台数据设定默认值
    mysql--sqlalchemy.exc.IntegrityError: (IntegrityError) (1215, 'Cannot add foreign key constraint'
    SQL Server 2014连接不到服务器解决方法
  • 原文地址:https://www.cnblogs.com/ccorz/p/6120783.html
Copyright © 2011-2022 走看看