ITS·黑客

【Python】笔记20(枚举类)

2017-05-20  本文已影响34人  阿凯Awesome

通过Enum类(需要从enum模块导入Enum类),定义常量而不是变量。

获得Month类型的枚举类

直接使用Month.Jan来引用一个常量,或者枚举它的所有成员:

value属性时自动赋给member的int常量,默认从1开始计数。

@unique,从enum导入的装饰器可以帮助检查保证没有重复值。

访问枚举类型:

单单print(Weekday.Mon)只能返回一个属性名,可以理解为Weekday.Mon只是Weekday的一个属性,print(Weekday['Tue'])应是同理在调用Weekday的Tue属性,print(Weekday(1))应是同理在调用Weekday中第一个属性;如果print(Weekday.Mon.value)则返回的是属性的值。

此时的属性名即是常量,value只是在调用常量的值。

动态语言,不是编译时定义的,而是运行时动态创建的。

type()函数可以查看一个类型或变量的类型。对于例子中的Hello是一个class,那它的类型就是type,而h是一个实例,那他的类型就是class Hello。

创建class的方法就是使用type()函数。

通过type()函数来创建Hello类:

第一步先定义函数,以便后面放入到类中;第二步创建Hello类,type()函数第一个参数是类名称,第二个参数是以tuple的方式继承父类集合(tuple单元素时要多加一个逗号),dict这是对class的方法名称与函数邦洞,将fn这个函数绑定传入到hello这个方法名上。

以上是动态的编译。

metaclass,要控制类的创建行为,可以用metaclass(元类)。它允许创建类或者修改类。

先定义metaclass,就可以创建类,最后创建实例。可以把类看成是metaclass创建出来的“实例”。

按照习惯,metaclass的类名称总是以metaclass结尾,以便表示这是一个metaclass。

如例子中为通过mateclass来为Mylist添加add方法。正常情况下,可以直接写,而不需要通过metaclass。但在ORM(Object Relational Mapping,对象-关系映射,把关系数据库的一行映射为一个对象,一个类对应一个表),写代码可以更简单。

__new()__方法接收到的,第一个参数是,当前准备创建的类的对象;第二个参数是类的名字;第三个参数是类基础的父类集合;第四个是类的方法集合;

ORM框架:?

(因过于抽象,暂且跳过)

上一篇下一篇

猜你喜欢

热点阅读