面向对象8--元类

本文介绍了元类的概念,包括如何理解“Python的一切皆对象”以及类是否也是对象。元类是类的类,用于控制类的创建。文章详细阐述了创建类的两种方式,包括直接使用`class`关键字和手动模拟创建过程,并探讨了如何自定义元类来规范类的行为,如确保类名首字母大写和强制添加注释。

1>元类的概念

    1.1> 知识储备只回顾exec方法,看一下它的三个参数

    参数1:object是一个字符串的语句或者一个编译过的语句的对象名称;

    参数2:全局作用域(字典形式),globals 是个 dict 对象,用来指定代码执行时可以使用的全局变量以及收集代码

    执行后的全局变量,如果不指定默认就使用globals();

    参数3:局部作用域(字典形式),locals 可以是任何 mapping 对象,用来指定代码执行时的局部变量以及收集代码

    执行后的局部变量,如果不指定默认就使用locals()。

    

    例子

    

    1.2> 说一说何为“python的一切皆对象”,对象可以怎么用

        1、都可以被引用,x=obj

        2、都可以当作函数的参数传入

        3、都可以当作函数的返回值

        4、都可以当作容器类的元素,l=[func,time,obj,1]

    那么,站在类的角度(比如就手动用 class定义一个类),类也满足上面的4点,是否类 也是一个对象?例子如下:

        

    此时的 type就是 元类。所有以 class定义的类都是以type为模板创建出来的,他们都是type实例化的对象

    所以,元类其实就是类的类,类的模板,class的元类就是type。

    type是python的一个内建元类,用来直接控制生成类

2>创建类的两种方式

    2.1> 用class定义一个类,如 class A():pass,这就定义了一个类A

    2.2> 是手动模拟class创建类的过程:将创建类的步骤拆分开,手动去创建

        创建之前,先看下类的组成:类名(毫无疑问,这个肯定要有),继承的父类(就算不写也会默认继承object,

        所以这项一定有),类的实体----也就是类的命名空间,定义类的时候,类里面的所有属性都会以字典形式存放

        在一个局部的名称空间里面,可以用__dict__查看这些属性。

        2.2.1>所以一个类应该就是由这么三部分组成,基于之前提到的exec方法,我们搞定 类的实体,也就是想办法

                  模拟产生一个类的实体。


        exec去执行类体的代码(exec产生名称空间的过程与真正的class过程类似,只是后者会将__开头的属性变形),

        生成类的局部名称空间,即填充字典。

        2.2.2>调用元类type(或者自定义的元类),来产生类A


        

3>自定义元类来控制类的行为

    一个类没有声明自己的元类,默认他的元类就是type,除了使用元类type,用户也可以通过继承type来自定义元类

    从需求开始:比如我想在创建类的时候,指定类名的首字母必须大写,且必须写注释,否则创建类的时候就报错。

    既然是要规范类行为,那么就只能去改 创建类的时候他继承的模板了,对吧

    恩, 那就创建一个元类,创建之前,再回忆下之前通过元类实例化类的时候需要的参数

    例如,假设我定义好了元类 Myclass,那么 创建类就是 A = Myclass('A', (object, ), class_dic),有三个参数哈

    所以,很明显,Myclass就该有三个参数:类名,基类,名称空间, 具体如下

   

    有三个参数,继承至type的参数,并且自定义了规则,这样便实现了通过元类来控制类的行为


有限计算框架 OOFEM最新版2.5主要内容: [1]这是什么 [2]必备条件 [3]安装 [4]运行oofem和oofeg [5]相关的链接 [1] 这是什么 ============================================================================== 下面的目录树包含OOFEM包的源代码。 OOFEM_TOP_DIR | |-- doc - 包含“用户指南User's guide”,生成“参考手册Reference manual”的资源, | documents 描述输入文件规范、素和材料库以及其他有用的文档。 | |-- src - 所有oofem模块的源文件 | | | |-- oofemlib - OOFEM核心部分OOFEMlib模块的源代码。 | | | |-- sm - 结构分析模块来源。 | | | |-- tm - 源传输问题模块. | | | |-- fm - 流体力学模块的来源。 | | | |-- dss - 包括直接稀疏求解器(DSS)的源代码,由R. Vondracek提供) | | | |-- main - 包含main()的源代码以及oofem、oofeg的一些全局函数的实现。 | | |-- tools - 几个实用程序的源代码。 | |-- tests -包含几个测试,这些测试对于验证程序功能非常有用。 | |-- bindings - 保存源文件,以生成到Python编程语言的OOFEM绑定。 [2] 必备条件 ============================================================================== oofem需要CMake跨平台构建系统和支持STL的c++编译器(标准模板库)。 oofem包含到iml++库的接口。 它是由Roldan Pozo编写的用于求解对称和非对称线性方程组的现代迭代方法的c++模板库。 可以从http://math.nist.gov/iml++/下载。 图形化后处理器(oofeg)需要安装Petr Krysl (http://www.multires.caltech.edu/~pkrysl/)的ELIXIR和Ckit库。 它们提供了X-windows图形支持。 与OOFEM一起使用的Elixir版本可能与Petr Krysl维护的原始版本不兼容。 兼容的Elixir版本可以在oofem主页(http://ksm.fsv.cvut.cz/oofem/oofem.html)上找到。 Ckit库可以在相同的位置获得。 对分布式内存的并行支持需要安装MPI库。如果您没有,我们建议您使用Open MPI。 这是一个免费的、高性能的、可移植的MPI实现(http://www.open-mpi.org/)。 对于高性能的特征值求解器,oofem使用了SLEPc。 该工具包可以从SLEPc项目主页(http://www.grycap.upv.es/slepc)下载。 通过tinyXML2库支持XML解析器。CEMHYD3D模型需要这个库, 可以从它的git存储库(https://github.com/leethomason/tinyxml2)下载。 可以从源文件自动生成参考手册。您也可以使用它来生成的文档。 为此,您必须安装doxygen文档系统 (http://sourceforge.net/projects/doxygen/) 和图形可视化工具包(http://www.research.att.com/sw/tools/graphviz/) 要从源文件构建素库、材料库和oofem输入手册,需要使用latex和latex 2 html包。 由于其大小,已编译的参考手册本身不包括在发行版中。可以从oofem主页在线访问。 [3] 安装 ============================================================================== UNIX快速说明: ---------------------------- 0)解压缩源1)创建树外构建目录“mkdir -p ~/build/debug” 2)配置目标“cd ~/build/debug; 其中,PATH_TO_OOFEM_SOURCES是指向OOFEM源目录的路径,创建于步骤0(例如~/oofem-2.2)。 3)编译OOF
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值