この記事では、Python メタクラスでのシングルトン モードの使用方法 (コード例) を紹介します。これには一定の参考値があります。必要な友人は参照できます。お役に立てば幸いです。
1. Python メタクラスとは
参考記事Python メタクラスとは何ですか? Python メタクラスの概要
2. シングルトン パターンとは
シングルトン パターン (シングルトン パターン) は、一般的に使用されるソフトウェア設計パターンです。そのコア構造には、シングルトンと呼ばれる特別なクラスが 1 つだけ含まれています。シングルトン モードでは、システム内にクラスのインスタンスが 1 つだけ存在し、外部からそのインスタンスに簡単にアクセスできるようにすることができるため、インスタンス数の制御が容易になり、システム リソースが節約されます。特定のクラスのオブジェクトを 1 つだけシステム内に存在させたい場合は、シングルトン パターンが最適なソリューションです。
クラスのインスタンスが 1 つだけであること、およびこのインスタンスに簡単にアクセスできることを確認するにはどうすればよいですか? グローバル変数を定義すると、いつでもオブジェクトにアクセスできるようになりますが、複数のオブジェクトのインスタンス化が妨げられるわけではありません。より良い解決策は、クラス自体にその唯一のインスタンスの保存を担当させることです。このクラスは、他のインスタンスが作成されないことを保証し、インスタンスにアクセスするメソッドを提供します。これがシングルトン パターンの背後にあるパターンの動機です。
3. __new__ を使用してシングルトンを実装する# -*- coding: utf8 -*-
class Singleton(object):
def __init__(self):
print 'entrance of __init__'
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
if __name__ == '__main__':
s1 = Singleton()
s2 = Singleton()
print s1, s2
Python では、通常、__new__ 関数を使用してシングルトン モードを実装します。 __new__ 関数は、C のコンストラクターと同様に、オブジェクトの構築を担当します。したがって、クラスがインスタンス オブジェクトを 1 つだけ作成するようにするには、__new__ 関数の動作をオーバーロードして、インスタンスを 1 つだけ構築できるようにします。上記のコードでは、_instance 属性が Singleton クラスに割り当てられています。_instance 属性が None の場合、インスタンス オブジェクトが作成され、_instance 属性はそのオブジェクトを参照 (ポイント) します。それ以外の場合は、_instance によって参照されるオブジェクトが直接返されます。 。したがって、コード内の s1 と s2 は実際には同じメモリ オブジェクトを参照します。 4. メタクラス __call__ を使用してシングルトンを実装する
# -*- coding: utf8 -*- # 单例模式 class SingletonMetaClass(type): def __init__(cls, *args, **kwargs): """ 初始化类 :param args: :param kwargs: """ print 'MetaClass.__init__ called' print cls._instance super(SingletonMetaClass, cls).__init__(*args, **kwargs) def __new__(cls, name, bases, attrs): """ 创建类,负责类的行为和属性的创建 :param name: :param bases: :param attrs: :return: """ print 'MetaClass.__new__ called' # 单例模式 cls._instance = None return type.__new__(cls, name, bases, attrs) # __call__方法其实和类的创建过程和实例化没有多大关系了,定义了__call__方法才能被使用函数的方式执行。 # 被该元类创建的类,属于该元类的一个实例。因此创建其实例的时候,会调用元类的__call_方法 def __call__(cls, *args, **kwargs): """ 使类变为可调用对象 :param args: :param kwargs: :return: """ print 'MetaClass.__call__ called' if cls._instance is None: # 这里会去调用类的__new__函数 cls._instance = super.__call__(SingletonMetaClass, cls).__call__(*args, **kwargs) return cls._instance class A(): __metaclass__ = SingletonMetaClass def __new__(cls, *args, **kwargs): print 'A.__new__ called' return super(A, cls).__new__(cls, *args, **kwargs) if __name__ == '__main__': # 因为类A是SingletonMetaClass的一个实例,执行A()时会调用元类SingletonMetaClass的__call__方法 a1 = A() print a1 a2 = A() print a2
Python ではクラスもオブジェクトであり、メタクラスはクラスを作成するクラスであることがわかっています。そのため、
クラスは実際には のインスタンス オブジェクトです。メタクラス。 Python では、オブジェクトが __call__ メソッドを定義している場合、そのオブジェクトは呼び出し可能オブジェクトです。つまり、関数を呼び出すことでオブジェクトを呼び出すことができます。 Python の __new__ メソッドはオブジェクトの作成を担当し、 __init__ メソッドはオブジェクトの初期化を担当します。上記のコードでは、
クラス A のオブジェクトはクラス A を作成した後でしか作成できないため、最初にクラス A を作成するには、SingletonMetaClass の __new__ メソッドと __init__ メソッドが最初に実行されます。ステートメント A() を実行してクラス A のオブジェクトを作成すると、__call__ メソッドの定義に従って、クラス A はメタクラス SingletonMetaClass のオブジェクトであるため、メタクラス SingletonMetaClass の __call__ メソッドが呼び出されることが期待できます。 。
つまり、上記のコードの SiingletonMetaClass の __new__ メソッドと __init__ メソッドは 1 回だけ実行され、クラスのインスタンスを作成するために A() が呼び出されるたびに SingletonMetaClass が呼び出されます。 A. __call__ メソッド。したがって、シングルトンモードを実装するには、メタクラスの __call__ メソッドで cls の _instance 属性が None であるかどうかを判断し、None であればメタクラスの親クラス (つまり type) の __call__ メソッド、type を呼び出します。 __call_ _method は、クラス A の __new__ メソッドを呼び出してクラス A のインスタンスを作成し、_instance 属性をそのインスタンスにポイントすることで、インスタンスを 1 つだけ実現します。実行の結果は次のとおりです。
MetaClass.__new__ called MetaClass.__init__ called None MetaClass.__call__ called A.__new__ called <__main__.A object at 0x00000000036D2EB8> MetaClass.__call__ called <__main__.A object at 0x00000000036D2EB8>関連する推奨事項:
設計パターンで責任連鎖パターンとイテレータ パターンを使用した Python の例
redis プールを使用した Python のシングルトン実装の概要
以上がPython メタクラスでのシングルトン モードの使用の概要 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

限られた時間でPythonの学習効率を最大化するには、PythonのDateTime、時間、およびスケジュールモジュールを使用できます。 1. DateTimeモジュールは、学習時間を記録および計画するために使用されます。 2。時間モジュールは、勉強と休息の時間を設定するのに役立ちます。 3.スケジュールモジュールは、毎週の学習タスクを自動的に配置します。

PythonはゲームとGUI開発に優れています。 1)ゲーム開発は、2Dゲームの作成に適した図面、オーディオ、その他の機能を提供し、Pygameを使用します。 2)GUI開発は、TKINTERまたはPYQTを選択できます。 TKINTERはシンプルで使いやすく、PYQTは豊富な機能を備えており、専門能力開発に適しています。

Pythonは、データサイエンス、Web開発、自動化タスクに適していますが、Cはシステムプログラミング、ゲーム開発、組み込みシステムに適しています。 Pythonは、そのシンプルさと強力なエコシステムで知られていますが、Cは高性能および基礎となる制御機能で知られています。

2時間以内にPythonの基本的なプログラミングの概念とスキルを学ぶことができます。 1.変数とデータ型、2。マスターコントロールフロー(条件付きステートメントとループ)、3。機能の定義と使用を理解する4。

Pythonは、Web開発、データサイエンス、機械学習、自動化、スクリプトの分野で広く使用されています。 1)Web開発では、DjangoおよびFlask Frameworksが開発プロセスを簡素化します。 2)データサイエンスと機械学習の分野では、Numpy、Pandas、Scikit-Learn、Tensorflowライブラリが強力なサポートを提供します。 3)自動化とスクリプトの観点から、Pythonは自動テストやシステム管理などのタスクに適しています。

2時間以内にPythonの基本を学ぶことができます。 1。変数とデータ型を学習します。2。ステートメントやループの場合などのマスター制御構造、3。関数の定義と使用を理解します。これらは、簡単なPythonプログラムの作成を開始するのに役立ちます。

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン
