元类:
python中一切接对象,那么我们所定义的类也是一个对象,那么这个类对象是怎么创建的?
class A(object):
attr = None
实例化a = A() 的过程:
1. 检查A是否有 __metaclass__ ,或者是全局中是否有__metaclass__,如果没有则找父类的,都没定义则使用元类type
(这一步并不是在调用A() 完成的,而是在执行,或者导入时)
2.调用元类中的 __new__, __init__ 创建类对象A
3.利用类对象A进行实例化
3.1 首先调用元类的__call__即 A()
__call__ (self,*args,**kwargs)内部调用:
1. 调用 __new__ 类对象的实例化 必须 返回
2. 调用 __init__
返回实例化对象
来一个例子:
class MyType(type):
def __new__(cls, name, bases, attrs):
return super(MyType, cls).__new__(cls, name, bases, attrs)
def __init__(self, name, bases, attrs):
self.mymetainit = 9
super(MyType, self).__init__(name, bases, attrs)
class MyObject:
data = 7
__metaclass__ = MyType
def __init__(self):
self.myname = "d"
def __new__(cls, *args, **kwargs):
return super(MyObject, cls).__new__(cls, *args, **kwargs)
类对象MyObject 是由MyType中的 __new__(创建类对象)与__init__(初始化类对象) 创建的的
MyObject 实例是由元类MyType调用__call__(内部调用 类对象MyObject 的 __new__和__init__)创建的
所以说元类中可以控制类对象的生成
欣赏一下单例模式代码:
class Sing(type):
def __init__(self, *args, **kwargs):
self.__instance = None
super(Sing, self).__init__(*args, **kwargs)
def __call__(self, *args, **kwargs):
if not self.__instance:
self.__instance = super(Sing, self).__call__(*args, **kwargs)
return self.__instance
class Obj(object):
__metaclass__ = Sing
def __init__(self):
self.name = 'wut'
self.age=10
b1 = Obj()
b2 = Obj()
print b1
print b2
==========================
outpu:
<__main__.Obj object at 0x7fae86307290>
<__main__.Obj object at 0x7fae86307290>