Python シングルトン パターンの例

高洛峰
リリース: 2017-03-03 11:57:47
オリジナル
1132 人が閲覧しました

この記事の例では、Python シングルトン パターンについて説明します。参考のために全員と共有してください。詳細は次のとおりです:

シングルトン モード: クラスにはインスタンスが 1 つだけあることを確認し、それにアクセスするためのグローバル アクセス ポイントを提供します。

クラスのインスタンスを 1 つだけ実現する方法:

1. グローバル変数を使用してオブジェクトにアクセスできるようにしますが、複数のオブジェクトが外部でインスタンス化されるのを防ぐことはできません。

2. クラス自体がその唯一のインスタンスを保存するようにします。このクラスは、他のインスタンスが作成できないことを保証します。

マルチスレッドのシングルトンモード: ロックダブルロック

ハングリースタイルのシングルトンクラス: クラスがロードされるときに自身をインスタンス化します(静的初期化)。利点は、マルチスレッド アクセスのセキュリティ問題を回避できることですが、欠点は、システム リソースを事前に占有してしまうことです。

遅延シングルトン クラス: 初めて参照されたときにのみインスタンス化します。最初はシステム リソースを占有することを避けてください。ただし、マルチスレッド アクセスにはセキュリティ上の問題があります。

例:

#encoding=utf-8
#单例模式
def PrintInfo(info):
#  print unicode(info,'utf-8').decode('gbk')
  print info.decode('utf-8').encode('utf-8')
import threading
#单例类
class Singleton():
  instance=None
  mutex=threading.Lock()
  def _init__(self):
    pass
  @staticmethod
  def GetInstance():
    if(Singleton.instance==None):
      Singleton.mutex.acquire()
      if(Singleton.instance==None):
        PrintInfo('初始化实例')
        Singleton.instance=Singleton()
      else:
        PrintInfo('单例已经实例化')
      Singleton.mutex.release()
    else:
      PrintInfo('单例已经实例化')
    return Singleton.instance
def clientUI():
  Singleton.GetInstance()
  Singleton.GetInstance()
  Singleton.GetInstance()
  return
if __name__=='__main__':
  clientUI();
ログイン後にコピー

結果:

初始化实例 单例已经实例化 单例已经实例化
ログイン後にコピー

追加の説明 @staticmethod Python で classmethod について言及するとき、staticmethod を言及する必要があります。これは、この 2 つに何らかの関係があるからではなく、ユーザーはコードをより明確に書くために区別します。 C++ では、クラス名を介して直接アクセスされる関数は、クラスの静的関数、つまり静的に変更された関数と呼ばれます。C++ のクラスメソッドと静的メソッドは同じ概念であることがわかります。 では、Python における 2 つの違いは何でしょうか?まず、この 2 つが Python コードでどのように宣言されているかを見てみましょう

class MyClass:
 ...
 @classmethod # classmethod的修饰符
 def class_method(cls, arg1, arg2, ...):
  ...
 @staticmethod # staticmethod的修饰符
 def static_method(arg1, arg2, ...):
  ...
ログイン後にコピー

classmethod のパラメータには、クラス名を暗黙的に渡す必要がありますが、staticmethod のパラメータにはクラス名を渡す必要はありません。実はこれが両者の最大の違いです。

どちらもクラス名またはクラス インスタンス オブジェクトを通じて呼び出すことができます。クラスメソッドと静的メソッドに重点が置かれているため、コードを記述するときはクラス名を使用するのが最善です。

静的メソッドはクラス内で定義されるように設定されていますが、このように使用されることはほとんどありません。モジュールレベルの関数を使用して置き換えることができます。クラス内で定義することになるので、作成者は考慮したはずです。

クラスメソッドの場合、サブクラスを通じて再定義できます。

クラスレベルの関数について言及し、クラスレベルの変数についても言及しました

class MyClass:
 i = 123 # class-level variable
 def __init__(self):
 self.i = 456 # object-level variable
 ...
ログイン後にコピー

上記の 2 つの i を明確に区別するための最良の方法は、Python のすべてがオブジェクトであると考えることです。したがって、i =123 は以下に属します。クラス オブジェクト、i=456 はクラス インスタンス オブジェクトに属します

Python シングルトン モードの例に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート