内建的 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动态构造类:借助强悍的内建 type()的更多相关文章

  1. python动态创建类的声明

    动态创建类的声明 使用内置函数type,原型:class type(name, bases, dict)name是类的名字,相当于__class__bases是类的基类,元组,可以有多个基类,但是基类 ...

  2. python动态构建类(类似声明)

    对于类实例的动态构建,那是非常的简单.可要在代码中动态的构建类,然后该类还能够被使用,那得多么的强大呀. 在Python中,内建的__builtin__提供了一个type的方法,用该方法可以动态的构建 ...

  3. python 字符串、列表、字典相关内建方法

    """字符串相关内建方法""" # a = ["qwe", "name", "sex&qu ...

  4. python 动态修改 类和实例 的方法

    相信很多朋友在编程的时候都会想修改一下已经写好的程序行为代码,而最常见的方式就是通过子类来重写父类的一些不满足需求的方法.比如说下面这个例子. class Dog: def bark(self): p ...

  5. Python基本语法_集合set/frozenset_内建方法详解

    目录 目录 前言 软件环境 可变集合Set set函数创建集合 创建空集合 集合元素的唯一性 集合推导式 set类型对象的内置方法 add增加一个元素 remove删除一个元素 pop随机删除并返回一 ...

  6. Python的程序结构[2] -> 类/Class[3] -> 内建类与内建函数

    内建类与内建函数的区分 / Distinction of Built-in Type and Function 对于 Python,有许多可以不需要定义或引用就可以使用的函数(类)(参考内建模块),诸 ...

  7. Python的程序结构[2] -> 类/Class[6] -> 内建类 map

    内建类map / Built-in Type map 关于内建类 map 是一个内建的类,能够返回一个 map 的 obj.map 的第一个参数为一个可执行函数,后续参数均为可迭代对象,map 会分别 ...

  8. Python常用内建方法:__init__,__new__,__class__的理解

    python中所有类都是继承自object, 而object提供了很多原始的内建属性和方法,所以用户自定义的类在Python中也会继承这些内建属性.可以使用dir()函数可以查看,虽然python提供 ...

  9. Python中编写类的各种技巧和方法

    简介 有关 Python 内编写类的各种技巧和方法(构建和初始化.重载操作符.类描述.属性访问控制.自定义序列.反射机制.可调用对象.上下文管理.构建描述符对象.Pickling). 你可以把它当作一 ...

随机推荐

  1. dosbox+masm5.0编译汇编文件

    在去年写过如何bc3.1编译ucos,不过现在很少去用到,但是那是用dosbox也是懵懵懂懂的,参见https://blog.csdn.net/liming0931/article/details/8 ...

  2. K Edit Distance

    Description Given a set of strings which just has lower case letters and a target string, output all ...

  3. CF463D Gargari and Permutations dp

    给定 $n<=10$ 个 $1$~$n$ 的排列,求这些排列的 $LCS$. 考虑两个排列怎么做:以第一个序列为基准,将第二个序列的元素按照该元素在第一个序列中出现位置重新编号. 然后,求一个 ...

  4. 洛谷P1038 神经网络题解

    注意如果是 \(if(c[i])\) 这条语句并没有说明c[i]不为负数,所以说最好老老实实的写 #include<cstdio> #define _ 0 using namespace ...

  5. Ceph osd故障恢复

    1  调高osd的日志等级 加上红框那一行就可以了 osd的日志路径:/var/log/ceph/ceph-osd.3.log 注意:加上了这一行后日志会刷很多,所以要特别注意日志容量的变化,以防把v ...

  6. P2016 战略游戏——树形DP大水题

    P2016 战略游戏 树形DP 入门题吧(现在怎么是蓝色标签搞不懂): 注意是看见每一条边而不是每一个点(因为这里错了好几次): #include<cstdio> #include< ...

  7. jquery.nicescroll.js Unable to preventDefault inside passive event listener due to target being treated as passive.

    解决办法就是:https://github.com/bestjhh/Plugin 下载替换. 参考: https://github.com/bestjhh/Plugin https://blog.cs ...

  8. Docker与Tomcat:去掉项目名称进行访问

    今天搭建了一个solo博客,想要去掉路径后的/solo 首先尝试了最简单的更改tomcat配置文件:server.xml <Context path="/" docBase= ...

  9. 2018-2019-2 《网络对抗技术》Exp9 WebGoat 20165326

    Web安全基础 jar包,密码:9huw 实验问题回答 SQL注入攻击原理,如何防御 原理:恶意用户在提交查询请求的过程中将SQL语句插入到请求内容中,同时程序本身对未对插入的SQL语句进行过滤,导致 ...

  10. 小福bbs-冲刺日志(第六天)

    [小福bbs-冲刺日志(第六天)] 这个作业属于哪个课程 班级链接 这个作业要求在哪里 作业要求的链接 团队名称 小福bbs 这个作业的目标 后端努力完成大部分功能操作,前端UI完成大部分功能测试 作 ...