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方法。
    这样如果 需要创建多个父类的话可以传递一个变量进去就可以生成多个类。然后就可以继承
    可以节省不少的代码量.

  • 相关阅读:
    使用python抓取知乎日报的API数据
    git 使用笔记(三)-分支的使用
    git 使用笔记(二)
    git 使用笔记(一)
    Grunt的配置和使用(一)
    笔记-Node.js中的核心API之HTTP
    笔记-Nodejs中的核心API之Events
    (译)Node.js的 EventEmitter 教程
    高性能网站优化-确保异步加载脚本时保持执行顺序
    linux环境下source vimrc提示错误unexpected token `"autocmd"'
  • 原文地址:https://www.cnblogs.com/ccorz/p/6120783.html
Copyright © 2011-2022 走看看