在学习崔庆才的代理池维护时,发现他使用了元类,所以进行研究
这篇文章很好的解释了元类的原理。
元类
其实要使用元类,就要搞清楚类是怎么创建的
所有的类都是通过type这个类创建的。
type的用法如下
type(name, bases, attrs)
name: name of the class
bases: tuple of the parent class (for inheritance, can be empty)需要继承的父类
attrs: dictionary containing attributes names and values,需要继承的函数和属性
Foo = type('Foo', (), {'bar':True})
type函数不仅可以找出int,str,class ,还可以用来创建类
print(type(1))
print(type(int))
print(type('yu'))
print(type(str))
class Parent(object):
pass
print(type(Parent))
print(type(Parent()))
print(type(type(Parent)))
print(type(type))
输出结果如下
<class 'int'>
<class 'type'>
<class 'str'>
<class 'type'>
<class 'type'>
<class '__main__.Parent'>
<class 'type'>
<class 'type'>
从这里我们可以看出不管任何类,他都是继承type类的。简单来说,type类是任何类的祖宗。所以我们在使用元类的时候要有这个想法。
print(hasattr(type,'__new__'))
从这里可以看出type类里面有__new__这个函数,这个函数其实是用来创建类的函数。所以我们想要修改type创建函数的方法,就必须先创建一个元类,也就是继承type类的类。
class METAclass(type):
def __new__(cls,name, bases, attrs):#和type函数需要传入的参数进行比较。
pass
return type.__new__(cls,name, bases, attrs)
class next_class(object, metaclass = METAclass):
pass
这样我们在创建next_class这个类的时候,就会自动采用METAclass中的__new__函数,后面返回一个type.__new__函数,而这个返回的函数就是用来创建next_class类的。