【发布时间】:2012-10-09 21:56:17
【问题描述】:
class Singleton(type):
def __init__(self, *args, **kwargs):
print 'calling __init__ of Singleton class', self
print 'args: ', args
print 'kwargs: ', kwargs
super(Singleton, self).__init__(*args, **kwargs)
self.__instance = None
def __call__(self, *args, **kwargs):
print 'running __call__ of Singleton', self
print 'args: ', args
print 'kwargs: ', kwargs, '\n\n'
if self.__instance is None:
self.__instance = super(Singleton, self).__call__(*args, **kwargs)
return self.__instance
class A(object):
__metaclass__ = Singleton
def __init__(self,a):
print 'in __init__ of A: ', self
self.a = a
print 'self.a: ', self.a
a=A(10)
b=A(20)
我从 Ben 对问题 Python's use of __new__ and __init__? 的回答中复制了这段代码,并对其进行了一些修改。但是,我不知道流量。尽管我从更高的层次上理解了这段代码的目的。但是,在内部它是如何工作的,我不太确定。
运行此代码时,我得到以下输出:-
calling __init__ of Singleton class <class '__main__.A'>
args: ('A', (<type 'object'>,), {'__module__': '__main__', '__metaclass__': <class '__main__.Singleton'>, '__init__': <function __init__ at 0x01F9F7B0>})
kwargs: {}
running __call__ of Singleton <class '__main__.A'>
args: (10,)
kwargs: {}
in __init__ of A: <__main__.A object at 0x01FA7A10>
self.a: 10
running __call__ of Singleton <class '__main__.A'>
args: (20,)
kwargs: {}
我不明白__init__ 和__call__ 的args 和kwargs 是如何变得不同的。
在使用元类时,此链接 (What is a metaclass in Python?) 解释了如何使用 __new__ 和函数作为元类。但是,我不明白__call__ 是如何被使用的。
有人能解释一下流程吗?我的意思是,__new__、__call__、__init__ 被调用的优先级以及谁调用它们?
【问题讨论】:
-
问题是,你想做什么?
-
我是许多 python 概念的新手。我正在尝试实现本在链接中的回答中提到的 Singleton 类:stackoverflow.com/questions/674304/pythons-use-of-new-and-init。另外,在实现过程中,我想了解我编写的程序的内部流程。
-
你读过documentation吗?我强烈建议您完整阅读该页面。
-
是的,但是,它的解释不如 glglgl 在下面的回答中解释的那样。
标签: python design-patterns singleton metaclass