1.シングルトンモードの概要
概要:クラスのインスタンスが1つだけ必要であり、グローバルアクセスポイントを提供します。
アプリケーションシナリオ:ログ挿入、タイマー、権限検証、リサイクルビン、Webサイトカウンター、スレッドプール、データベース接続プールなどのリソースプール。
第二に、ログレコーダーの実現
オブジェクトのインスタンス化プロセスは、__new__方法
最初にクラスを実行することです。クラスを記述しない場合__new__
、デフォルトでオブジェクトメソッドが呼び出され、インスタンス化されたオブジェクトが返され、__init__方法
このオブジェクトを初期化するために呼び出されます。これに基づいてシングルトンを実装できます。
__new__方法中
まず、クラスにインスタンスがあるかどうかを判断します。インスタンスがある場合は直接返され、インスタンスがない場合は作成されます。
# coding=utf-8
class Singleton(object):
"""
单例类
"""
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls) # python3
# cls._instance = super(Singleton, cls).__new__(cls,*args, **kwargs) # python2
return cls._instance
class Logger(Singleton):
"""
日志
"""
def __init__(self, file_name):
self.filename = file_name
def _write_log(self, level, msg):
with open(self.filename, "a") as log_file:
log_file.write("[{0}]{1}\n".format(level, msg))
def critical(self, msg):
self._write_log("CRITICAL", msg)
def error(self, msg):
self._write_log("ERROR", msg)
def warn(self, msg):
self._write_log("WARN", msg)
def info(self, msg):
self._write_log("INFO", msg)
def debug(self, msg):
self._write_log("DEBUG", msg)
if __name__ == '__main__':
log1 = Logger("logger1.log")
log2 = Logger("logger2.log")
print(id(log1), log1.filename)
print(id(log2), log2.filename)
log1.info("log1************")
log1.warn("log1************")
log2.info("log2************")
log2.warn("log2************")
コンソール出力は次のとおりです。
566521222648 logger2.log
566521222648 logger2.log
logger2.logファイルを生成します。ファイルの内容は次のとおりです。
[INFO] log1 ************ [WARN] log1 ************ [INFO] log2 ************ [WARN ] log2 ************
結果は次のことを示しています。ログ情報の内容が同じファイルに記録されている
参照
[ウェッセルバーデンホルスト]実用的なPythonデザインパターン:一般的な問題のパイロニックソリューション
https://blog.csdn.net/sxb0841901116/article/details/78506643
https://www.runoob.com/design-pattern/singleton-pattern.html