class MyType(type):
def __init__(self, what, bases=None, dict=None):
print('call myType.__init__()') #语句 1
super().__init__(what, bases, dict)
def __new__(cls, name, bases, attrs):
print("call MyType.__new__()") #语句 2
return type.__new__(cls, name, bases, attrs)
def __call__(self, *args, **kwargs):
print("MyType.__call__")
class Foo(object, metaclass=MyType):
def __init__(self, name=None):
self.name = name
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)
if __name__ == '__main__':
print("---------test---------") #语句 3
obj=Foo() #语句 4
上面代码在 PYTHON3.6 中输出如下:
call MyType.__new__() #语句 2 的输出
call myType.__init__() #语句 1 的输出
---------test---------
MyType.__call__ #语句 4 的输出
我的问题如下:
1、当 PYTHON 加载模块的时候,是否就会自动执行类定义中的 __init__和__new__方法,以此实现为类分配内存的目的?
2、为何语句 4 “ obj=Foo()” 会导致__call__方法的执行?
我看了一些博文,都提到“对象=类名()”这样的语句是不应该导致__call__执行的,只有“对象()”以及“类名()()”这两种语句才会触发__call__,
上面语句 4 的输出是怎么回事呢?
感谢指点!
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/375985
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.