class Meta_1(type):
def __call__(cls, *a, **kw):
print("entering Meta_1.__call__()") #语句 1
rv = super(Meta_1, cls).__call__(*a, **kw) #语句 2
print("exiting Meta_1.__call__()") #语句 3
return rv
class Class_1(object,metaclass = Meta_1):
def __new__(cls, *a, **kw):
print("entering Class_1.__new__()") #语句 4
rv = super(Class_1, cls).__new__(cls, *a, **kw)
print("exiting Class_1.__new__()")
return rv
def __init__(self, *a, **kw):
print("executing Class_1.__init__()")
super(Class_1,self).__init__(*a, **kw)
print("---test---")
c = Class_1()
输出如下:
---test---
entering Meta_1.__call__()
entering Class_1.__new__()
exiting Class_1.__new__()
executing Class_1.__init__()
exiting Meta_1.__call__()
我的问题是:
1、模块被加载时,类定义的__new__和__init__就应该被执行了吧?为何从上面程序的输出来看并没有执行,因为第一个输出就是"---test---",说明是等到实际执行程序主体时才发生的输出。
2、类定义的__new__和__init__应该是在__call__方法之前执行的吧,但为何实际上先执行的却是 Meta_1 的__call__方法,而不是 Class_1 的__new__和__init__?
2、从输出来看,语句 1 执行完毕后,不是执行紧接着的语句 2,而是去执行语句 4 了,这又是为什么呢?
def __call__(cls, *a, **kw):
print("entering Meta_1.__call__()") #语句 1
rv = super(Meta_1, cls).__call__(*a, **kw) #语句 2
print("exiting Meta_1.__call__()") #语句 3
return rv
class Class_1(object,metaclass = Meta_1):
def __new__(cls, *a, **kw):
print("entering Class_1.__new__()") #语句 4
rv = super(Class_1, cls).__new__(cls, *a, **kw)
print("exiting Class_1.__new__()")
return rv
def __init__(self, *a, **kw):
print("executing Class_1.__init__()")
super(Class_1,self).__init__(*a, **kw)
print("---test---")
c = Class_1()
输出如下:
---test---
entering Meta_1.__call__()
entering Class_1.__new__()
exiting Class_1.__new__()
executing Class_1.__init__()
exiting Meta_1.__call__()
我的问题是:
1、模块被加载时,类定义的__new__和__init__就应该被执行了吧?为何从上面程序的输出来看并没有执行,因为第一个输出就是"---test---",说明是等到实际执行程序主体时才发生的输出。
2、类定义的__new__和__init__应该是在__call__方法之前执行的吧,但为何实际上先执行的却是 Meta_1 的__call__方法,而不是 Class_1 的__new__和__init__?
2、从输出来看,语句 1 执行完毕后,不是执行紧接着的语句 2,而是去执行语句 4 了,这又是为什么呢?