通过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框架:?
(因过于抽象,暂且跳过)
网友评论