type()函数既可以返回一个对象的类型,又可以创建出新的类型,原型为:
type(object) -> the object's type
type(name, bases, dict) -> a new type
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)
#value属性则是自动赋给成员的int常量,默认从1开始计数。
from enum import Enum, unique
@unique
class Weekday(Enum):
Sun = 0 # Sun的value被设定为0
Mon = 1
Tue = 2
Wed = 3
Thu = 4
Fri = 5
Sat = 6
#@unique装饰器可以帮助我们检查保证没有重复值
#既可以用成员名称引用枚举常量,又可以直接根据value的值获得枚举常量;Enum可以把一组相关常量定义在一个class中,且class不可变,而且成员可以直接比较
除了使用type()动态创建类以外,要控制类的创建行为,还可以使用metaclass。
metaclass,直译为元类,简单的解释就是:
当我们定义了类以后,就可以根据这个类创建出实例,所以:先定义类,然后创建实例。但是如果我们想创建出类呢?那就必须根据metaclass创建出类,所以:先定义metaclass,然后创建类。连接起来就是:先定义metaclass,就可以创建类,最后创建实例。所以,metaclass允许你创建类或者修改类。换句话说,你可以把类看成是metaclass创建出来的“实例”。
# metaclass是类的模板,所以必须从`type`类型派生:
class ListMetaclass(type):
def __new__(cls, name, bases, attrs):
attrs['add'] = lambda self, value: self.append(value)
print(type(cls))
return type.__new__(cls, name, bases, attrs)
class MyList(list, metaclass=ListMetaclass):
pass
ml=MyList()
print(type(ml))
print(dir(ml))
ml.add(1)
ml.add(2)
print(ml)
#__new__()方法接收到的参数依次是:
# cls:当前准备创建的类的对象,即ListMetaclass;
# name:类的名字,即MyList;
# bases:类继承的父类集合;
# attrs:类的方法集合。
metaclass是Python中非常具有魔术性的对象,它可以改变类创建时的行为。这种强大的功能使用起来务必小心。