meta class 和類裝飾器的執行順序
先執行decorator,後執行metaclass
程序是從上到下執行,先遇到decorator,後遇到class,創建class 調用metaclass.
同理,裝飾器也是先執行上面的後執行下面的,所以如果@property
和別的裝飾器共同裝飾一個方法,一定要將@property
放到最上面
def deco(function):
print 'i am in deco'
return function
class MetaClass(type):
def __init__(cls, name, bases, attr):
print 'i am in MetaClass __init__'
def __new__(meta, cls_str, cls, args_dict):
print 'i am in MetaClass __new__'
return super(MetaClass, meta).__new__(meta, cls_str, cls, args_dict)
def __call__(cls, *args, **kwargs):
print 'i am in MetaClass __meta__'
self = cls.__new__(cls, *args, **kwargs)
return self
class Home(object):
__metaclass__ = MetaClass
@deco
def index(self):
print 'i am in index'
Home()
# i am in deco
# i am in MetaClass __new__
# i am in MetaClass __init__
# i am in MetaClass __meta__