@yanglt7
2018-12-03T07:55:10.000000Z
字数 2495
阅读 683
Python
为这样的枚举类型定义一个 class 类型,然后,每个常量都是 class 的一个唯一实例。Python 提供了 Enum 类来实现这个功能:
>>> from enum import Enum>>> Month=Enum('Month',('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'))>>> for name,member in Month.__members__.items():... print(name,'=>',member,',',member.value)...Jan => Month.Jan , 1Feb => Month.Feb , 2Mar => Month.Mar , 3Apr => Month.Apr , 4May => Month.May , 5Jun => Month.Jun , 6Jul => Month.Jul , 7Aug => Month.Aug , 8Sep => Month.Sep , 9Oct => Month.Oct , 10Nov => Month.Nov , 11Dec => Month.Dec , 12
如果需要更精确地控制枚举类型,可以从 Enum 派生出自定义类:
from enum import Enum, unique@uniqueclass Weekday(Enum):Sun = 0 # Sun 的 value 被设定为 0Mon = 1Tue = 2Wed = 3Thu = 4Fri = 5Sat = 6
访问这些枚举类型可以有若干种方法:
>>> day1 = Weekday.Mon>>> print(day1)Weekday.Mon>>> print(Weekday.Tue)Weekday.Tue>>> print(Weekday['Tue'])Weekday.Tue>>> print(Weekday.Tue.value)2>>> print(day1 == Weekday.Mon)True>>> print(day1 == Weekday.Tue)False>>> print(Weekday(1))Weekday.Mon>>> print(day1 == Weekday(1))True>>> Weekday(7)Traceback (most recent call last):...ValueError: 7 is not a valid Weekday>>> for name, member in Weekday.__members__.items():... print(name, '=>', member)...Sun => Weekday.SunMon => Weekday.MonTue => Weekday.TueWed => Weekday.WedThu => Weekday.ThuFri => Weekday.FriSat => Weekday.Sat
要定义一个 Hello 的 class,就写一个 hello.py 模块:执行结果就是动态创建出一个 Hello 的 class 对象,测试如下:
>>> class Hello(object):... def hello(self,name='world'):... print('Hello,%s.' % name)...>>> from hello import Hello>>> h=Hello()>>> h.hello()Hello,world.>>> print(type(Hello))<class 'type'>>>> print(type(h))<class '__main__.Hello'>
type() 函数可以查看一个类型或变量的类型,Hello 是一个 class,它的类型就是 type,而 h 是一个实例,它的类型就是 class Hello。
type() 函数既可以返回一个对象的类型,又可以创建出新的类型,比如,我们可以通过 type() 函数创建出 Hello 类,而无需通过 class Hello(object)... 的定义:
>>> def fn(self,name='world'):... print('Hello,%s.' % name)...>>> Hello=type('Hello',(object,),dict(hello=fn))>>> h=Hello()>>> h.hello()Hello,world.>>> print(type(Hello))<class 'type'>>>> print(type(h))<class '__main__.Hello'>
要创建一个 class 对象,type() 函数依次传入3个参数:
class的名称;
继承的父类集合,注意 Python 支持多重继承,如果只有一个父类,别忘了 tuple 的单元素写法;
class 的方法名称与函数绑定,这里我们把函数 fn 绑定到方法名 hello 上。
先定义 metaclass,就可以创建类,最后创建实例。
定义 ListMetaclass,按照默认习惯,metaclass 的类名总是以 Metaclass 结尾,以便清楚地表示这是一个 metaclass:
>>> class ListMetaclass(type):... def __new__(cls,name,bases,attrs):... attrs['add']=lambda self,value:self.append(value)... return type.__new__(cls,name,bases,attrs)...
有了 ListMetaclass,我们在定义类的时候还要指示使用 ListMetaclass 来定制类,传入关键字参数 metaclass:
>>> class MyList(list,metaclass=ListMetaclass):... pass
__new__() 方法接收到的参数依次是:
当前准备创建的类的对象;
类的名字;
类继承的父类集合;
类的方法集合。
测试一下 MyList 是否可以调用 add() 方法:
>>> L=MyList()>>> L.add(1)>>> L[1]