type
type函数即可返回一个对象的类型,也可动态地创建一个新的类。如:
def say(self): # 因为该方法要传入到类中,所以必须定义一个self参数
print("say hello")
d = type('Demo', (object,), dict(say=say))
d1 = d()
d1.say() # say hello
第一个参数是类名,第二个参数是类的父类,第三个参数是类中的属性——以字典的形式传入。整句话执行结束后,就相当于创建了一个类名为Demo的类。
type()创建了一个类,并且使用变量d来作为类的引用。
可以看出在Python中,类也是对象,可以动态的创建类。这就是当你使用关键字class时Python在幕后做的事情,而这就是通过元类来实现的。
元类
python中, 类也是一个对象,对象名就是类名,该对象拥有创建对象(类实例)的能力。做为一个变量,可以为它添加新的属性,可以将它赋值给另一个变量,也可以当作参数传递。如:
>>> class Demo(object):
pass
>>> D = Demo
>>> print(D)
<class '__main__.Demo'>
>>> Demo.age='age'
>>> print(Demo.age)
age
>>> print(Demo)
<class '__main__.Demo'>
因为类也是对象,所以可以使用class关键字动态地创建它们。而元类就是创建类的类,它负责创建类,而由类创建类的实例。
元类就是类的类,它负责创建不同的类,而由不同的类创建不同的类实例。如下:
class DemoMetaClas222s(type): # 元类
def __new__(cls, name, bases, attrs):
print(cls) # 元类对象
print(name) # 创建的类的类名 Demo
print(bases) # 创建的类的父类集合
print(attrs) # 创建的类的属性(含方法)
attrs['add'] = lambda self, value: print("the value = %s" % value) # 为创建的类添加了属性add,它是一个方法
attrs['name'] = 'namexxxxx' # 为创建的类添加name属性
return type.__new__(cls, name, bases, attrs) # 通过type模块创建新的类
class Demo(object, metaclass=DemoMetaClas222s): # 通过metaclass指定该类对应的元类
pass
d = Demo()
d.add(111) # the value = 111
print(d.name) # namexxxxx
元类通过__new__方法操作新建成的类,比如添加方法以及添加属性等。
新建的类通过metaclass指定它对应的元类。