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

  • 相关阅读:
    BZOJ5368:[PKUSC2018]真实排名(组合数学)
    【HDU2222】Keywords Search
    KMP算法
    【BZOJ3262】 陌上花开
    【POJ2104】kth num
    【BZOJ1251】序列终结者
    【BZOJ3524】 [Poi2014]Couriers
    【BZOJ2049】 [Sdoi2008]Cave 洞穴勘测
    【BZOJ1468】Tree
    【BZOJ2152】聪聪可可
  • 原文地址:https://www.cnblogs.com/ccorz/p/6120783.html
Copyright © 2011-2022 走看看