1

出典: Python とシングルトン パターン

トップアンサーの最も支持されたコメントによると、 newがクラスインスタンスを返す場合、 initは複数回呼び出されます。

だから私はこれをチェックしました:

class Singleton(object):

    _instance = None

    def __new__(cls, *args, **kwargs):
        print 'Singleton.__new__ called with class', cls
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
        return cls._instance


class Cache(Singleton):

    def __init__(self, size=100):
        print 'I am called with size', size


class S(Singleton):
    def __init__(self, param):
        print 'I am S with param', param


c = Cache(20)
s = S(10)

結果:

Singleton.__new__ called with class <class '__main__.Cache'>
I am called with size 20
Singleton.__new__ called with class <class '__main__.S'>
I am S with param 10

どうやらinitは、Singleton から継承するクラスで複数回呼び出されることはありません。それまでの間、これを処理する Python で smth が変更されましたか (2008 年に質問が行われたことを考慮して)、またはここで smth が欠落していますか?

4

2 に答える 2

0

最後の2行を次のように置き換えてください

for x in range(5):
    c = Cache(x)
    s = S(x)

そして結果を投稿します。

于 2013-08-22T15:18:40.303 に答える
0

__init__印刷結果から、各 newCacheおよびSオブジェクトの構築時に が呼び出されることは明らかです。

クラス (例: Cache(10)) のインスタンスを作成するとき、Python は最初に を使用して新しいインスタンスを作成し、__new__次に を使用して初期化し__init__ます。

言い換えれば、どうやらあなたは何かを読み違えているようです。

于 2013-08-22T15:18:54.030 に答える