前提・実現したいこと
Pythonクックブック第2版の『6.15 Singletonデザインパターンを実装する』のコードなのですが、Python3で実行するとエラーが発生します。
どのようにコードを変えれば良いのでしょうか?
発生している問題・エラーメッセージ
TypeError: object.__new__() takes exactly one argument (the type to instantiate)
該当のソースコード
Python3
1class Singleton(object): 2 def __new__(cls, *args, **kwargs): 3 if '_inst' not in vars(cls): 4 #breakpoint() 5 cls._inst = super(Singleton, cls).__new__(cls, *args, **kwargs) 6 return cls._inst 7 8if __name__ == '__main__': 9 class SingleSpam(Singleton): 10 def __init__(self, s): self.s = s 11 def __str__(self): return self.s 12 s1 = SingleSpam('spam') 13 print(id(s1), s1.spam()) 14 s2 = SingleSpam('eggs') 15 print(id(s2), s2.spam())
試したこと
breakpoint()にて変数などの確認
new(cls)へ変更
など
補足情報(FW/ツールのバージョンなど)
cls._inst = super(Singleton, cls).new(cls)
に変更すると動くようですが、なぜこのようにすると動くようになるのか、なぜクックブックに書かれている方法では動かないのか分かりません。
ちなみに、print(id(s2), s2.spam())もprint(id(s2), s2.s)だと思いますが。
回答2件
あなたの回答
tips
プレビュー