class MyType(type):
def __init__(self, what, bases=None, dict=None):
print('call myType.__init__()')
print("class name:"+what)
print("class bases:"+str(bases))
print("class attributions:"+str(dict))
super().__init__(what, bases, dict)
def __new__(cls, name, bases, attrs):
print("call MyType.__new__()")
return type.__new__(cls, name, bases, attrs)
class Foo(object):
__metaclass__ = MyType #语句 1
def __init__(self, name=None):
self.name = name
print("Foo.__init__ self=", self)
print("Foo
self.name=",
self.name)
def __new__(cls, *args, **kwargs):
print("Foo.__new__ cls=", cls)
return(object.__new__(cls, *args, **kwargs))
def __call__(self, cls):
print("Foo.__call__ cls=", cls)
print("Foo.__call__ self=", self)
def func(self):
print('function is there')
class studen(Foo):
print("studen(Foo)") #语句 2
def __init__(self, name=None):
print("studen.__init__ self=", self)
class Foo2(object):
"""docstring for Foo2"""
def __init__(self):
print('Foo2.__init__ self.__class__=', self.__class__)
print("Foo2.__init__ type(self)=", type(self))
if __name__ == '__main__':
print("---------test1---------") #语句 3
obj2=Foo() #语句 4
print("---------test2---------")
print("test2 type=", type(studen()))
print("---------test3---------")
print("test3 type=", type(Foo2()))
上面这段代码的输出如下:
studen(Foo)
---------test1---------
Foo.__new__ cls=
Foo.__init__ self= <__main__.Foo object at 0x01C2A270>
Foo
self.name= None
---------test2---------
Foo.__new__ cls=
studen.__init__ self= <__main__.studen object at 0x01C2A350>
test2 type=
---------test3---------
Foo2 self.__class__=
Foo2 type(self)=
test3 type=
我的问题如下:
1、为何语句 2 会在语句 3 之前先执行了?是不是因为类定义中的不在__new__()、__init__()和__call__()的方法之内的语句都会在模块被加载的时候立即执行?
2、在语句 1 中,我已经指定 Foo 类要由 MyType 类来实例化创建,为何执行语句 4 的时候,类 MyType 定义中的__new__()和__init__()方法都没有被首先执行?
恳请指点,感谢!
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.