什么是元类
在Python中,万物均为对象,如整数、字符串、函数以及类都是对象。
元类就是类的类,也就说元类也是一种对象,只不过是一种特殊的对象。
当我们使用关键字class时Python在幕后会为我们创建类,而这就是通过元类来实现的,type就是Python在背后用来创建所有类的元类, 也就是说,type是Python的内建元类。
type语法如下:
class type(object)
class type(name, bases, dict)
一个参数时type返回对象的类, 三个参数时返回新的类对象。
在一个单数时,参数object为对象。
在三个参数时,name为新的类的名称,bases为基类的元组,dict字典为类内定义的命名空间变量。元组就是一个不可变的列表(list)。
如下为type函数示例:
print (type(1))
print (type('shenzhen'))
print (type([2]))
print (type({0:'zero'}))
print (type( 1 ) == int)
print (int.__class__)
X = type('X', (), {})
print (X)
print (X.__class__)
示例运行结果如下:
其中,前四个打印为整型、字符串、列表、字典等基本数据类型类名,第五个为逻辑值。
int.__class__为int类的类,即为type,说明int类是由type类创建出来的。
X = type('X', (), {})语句定义了一个新类,类名为X,打印X.__class__,结果仍为type。
从上例,验证了类的类为type类,该type为元类的结论。
注:如果你对在打印自定义类时疑惑为何会打印‘__main__.类名’,请查看如下文章链接:
待更新。
两种类定义方法
使用传统的类定义方法和元类定义方法示例如下:
class Person:
pass
class X1(Person):
age = 21
X2 = type('X2', (Person,), {'age':21})
print (X1)
print (X2)
print (X1.__dict__)
print (X2.__dict__)
X1类使用传统的定义方法,X2使用元类定义实现,但X1的定义在执行时,会被Python翻译成X2的方式执行。
示例执行结果:
自定义元类
自定义元类,需要知道系统的预定义方法__new__。__new__()方法是类的静态方法,即使没有被加上静态方法装饰器。
__new__ 是在__init__之前被调用的特殊方法,是用来创建对象并返回之的方法,我们很少用到__new__,除非希望能够控制对象的创建,这里,我们创建的对象是类,我们希望能够自定义它,所以这里改写__new__。
如下为自定义元类的示例:
class UpperAttrMetaclass(type):
def __new__(cls, name, bases, dct):
attrs = ((name, value) for name, value in dct.items() if not name.startswith('__'))
uppercase_attr = dict((name.upper(), value) for name, value in attrs)
return super(UpperAttrMetaclass, cls).__new__(cls, name, bases, uppercase_attr)
X = UpperAttrMetaclass('X2', (), {'age':21})
print (X.__dict__)
示例运行结果如下:
如果你喜欢这篇文章,别忘了点赞和评论!