class SingletonType(type): """ 单例元类。用于将普通类转换为单例类。 """ _instances = {} # 存储单例实例的字典 def __call__(cls, *args, **kwargs): """ 重写 __call__ 方法。用于创建和返回单例实例。 """ if cls not in cls._instances: # 如果类还没有实例化过 cls._instances[cls] = super().__call__(*args, **kwargs) # 则创建新实例并存储在字典中 return cls._instances[cls] # 返回字典中的实例 class MyClass(metaclass=SingletonType): """ 单例类。使用元类 SingletonType 将其转换为单例类。 """ def __init__(self, name): self.name = name def say_hello(self): print(f"Hello, my name is {self.name}.") # 创建 MyClass 的两个实例,应该是同一个对象 obj1 = MyClass("Alice") obj2 = MyClass("Bob") # 打印两个实例的内存地址,应该相同 print(hex(id(obj1))) # 输出:0x7f8d94547a90 print(hex(id(obj2))) # 输出:0x7f8d94547a90 # 调用两个实例的方法,输出应该相同 obj1.say_hello() # 输出:Hello, my name is Alice. obj2.say_hello() # 输出:Hello, my name is Alice.
위 코드에서는 SingletonType
이라는 메타클래스를 정의하고 이를 할당합니다. MyClass</code에 대한 메타클래스로 사용됩니다. >. <code>SingletonType
클래스에서는 각 클래스의 고유한 인스턴스를 저장하는 _instances
사전을 유지 관리합니다. __call__()
메서드에서 _instances
사전을 확인하고 클래스에 아직 인스턴스가 없으면 새 인스턴스를 만들어 _instances<에 추가합니다. /코드>. 마지막으로 <code>_instances
에 인스턴스를 반환합니다. SingletonType
的元类,并将其用作 MyClass
的元类。在 SingletonType
类中,我们维护了一个 _instances
字典,用于存储每个类的唯一实例。在 __call__()
方法中,我们检查 _instances
字典,如果类尚未拥有实例,则创建一个新实例并添加到 _instances
中。最后,我们返回 _instances
中的实例。
在 MyClass
类中,我们定义了一个带参数的构造函数,并且使用 metaclass
参数来指定 SingletonType
元类。由于 MyClass
类使用 SingletonType
元类,因此它具有单例行为。在程序中,我们创建了 MyClass
的两个实例 obj1
和 obj2
,然后打印它们的内存地址以验证它们是否是同一个对象。最后,我们调用这两个实例的方法,输出应该相同。
def singleton(cls): """ 单例装饰器。用于将普通类转换为单例类。 """ instances = {} # 存储单例实例的字典 def get_instance(*args, **kwargs): """ 获取单例实例的方法。 """ if cls not in instances: # 如果类还没有实例化过 instances[cls] = cls(*args, **kwargs) # 则创建新实例并存储在字典中 return instances[cls] # 返回字典中的实例 return get_instance @singleton class MyClass: """ 单例类。使用装饰器 singleton 将其转换为单例类。 """ def __init__(self, name): self.name = name def say_hello(self): print(f"Hello, my name is {self.name}.") # 创建 MyClass 的两个实例,应该是同一个对象 obj1 = MyClass("Alice") obj2 = MyClass("Bob") # 打印两个实例的内存地址,应该相同 print(hex(id(obj1))) # 输出:0x7f8d94547a90 print(hex(id(obj2))) # 输出:0x7f8d94547
在上面的代码中,我们定义了一个名为 singleton
的装饰器函数。在 singleton
函数内部,我们创建了一个 instances
字典,用于存储每个类的唯一实例。然后,我们定义了一个名为 get_instance
的内部函数,用于获取单例实例。在 get_instance
函数中,我们检查 instances
字典,如果类尚未拥有实例,则创建一个新实例并添加到 instances
中。最后,我们返回字典中的实例。
在 MyClass
类上应用 @singleton
装饰器,以将其转换为单例类。由于该装饰器是针对类进行操作的,因此它可以轻松地将任何普通类转换为单例类。在程序中,我们创建了 MyClass
的两个实例 obj1
和 obj2
,然后打印它们的内存地址以验证它们是否是同一个对象。最后,我们调用这两个实例的方法,输出应该相同。
# mymodule.py class MyClass: """ 单例类。 """ def __init__(self, name): self.name = name def say_hello(self): print(f"Hello, my name is {self.name}.") my_singleton = MyClass("Alice") # 创建单例实例
# main.py from mymodule import my_singleton # 使用单例实例 my_singleton.say_hello() # 输出:Hello, my name is Alice.
在上面的代码中,我们将 MyClass
类定义在一个独立的模块 mymodule.py
中,并在其中创建了一个单例实例 my_singleton
。然后,在另一个文件 main.py
中,我们从 mymodule
模块中导入 my_singleton
实例,并使用它来调用 say_hello()
方法。
由于 Python 模块在首次导入时会自动执行,因此我们可以利用这一特性来创建单例实例。在 mymodule.py
模块中,我们可以确保 my_singleton
只会被创建一次,并在程序的其他部分中共享它。
class MyClass: """ 单例类。 """ _instance = None # 存储单例实例的类变量 def __new__(cls, *args, **kwargs): """ 重写 __new__ 方法。用于创建和返回单例实例。 """ if cls._instance is None: # 如果类还没有实例化过 cls._instance = super().__new__(cls) # 则创建新实例并存储在类变量中 return cls._instance # 返回类变量中的实例 def __init__(self, name): self.name = name def say_hello(self): print(f"Hello, my name is {self.name}.") # 创建 MyClass 的两个实例,应该是同一个对象 obj1 = MyClass("Alice") obj2 = MyClass("Bob") # 打印两个实例的内存地址,应该相同 print(hex(id(obj1))) # 输出:0x7f8d94547a90 print(hex(id(obj2))) # 输出:0x7f8d94547a90 # 调用两个实例的方法,输出应该相同 obj1.say_hello() # 输出:Hello, my name is Alice. obj2.say_hello() # 输出:Hello, my name is Alice.
在上面的代码中,我们将 MyClass
类的构造函数改为 __new__()
方法,并使用 _instance
类变量来存储单例实例。在 __new__()
方法中,我们检查 _instance
变量,如果类尚未拥有实例,则创建一个新实例并添加到 _instance
中。最后,我们返回 _instance
中的实例。
在程序中,我们创建了 MyClass
的两个实例 obj1
和 obj2
MyClass
클래스에서는 매개변수가 있는 생성자를 정의하고 metaclass
매개변수를 사용하여 SingletonType
메타클래스를 지정합니다. MyClass
클래스는 SingletonType
메타클래스를 사용하므로 싱글톤 동작을 갖습니다. 프로그램에서 MyClass
, obj1
및 obj2
의 두 인스턴스를 만든 다음 해당 메모리 주소를 인쇄하여 동일한 개체인지 확인합니다. . 마지막으로 두 인스턴스 모두에서 메서드를 호출하면 출력이 동일해야 합니다. Decorator: 🎜rrreee🎜위 코드에서는 singleton
이라는 데코레이터 함수를 정의합니다. singleton
함수 내에서 각 클래스의 고유한 인스턴스를 저장하는 instances
사전을 생성합니다. 그런 다음 싱글톤 인스턴스를 가져오기 위해 get_instance
라는 내부 함수를 정의합니다. get_instance
함수에서 instances
사전을 확인하고 클래스에 아직 인스턴스가 없으면 새 인스턴스를 생성하여 인스턴스
에 추가합니다. >. 마지막으로 사전에 인스턴스를 반환합니다. 🎜🎜MyClass
클래스에 @singleton
데코레이터를 적용하여 싱글톤 클래스로 변환하세요. 이 데코레이터는 클래스에서 작동하므로 일반 클래스를 싱글톤 클래스로 쉽게 변환할 수 있습니다. 프로그램에서 MyClass
, obj1
및 obj2
의 두 인스턴스를 만든 다음 해당 메모리 주소를 인쇄하여 동일한 개체인지 확인합니다. . 마지막으로 두 인스턴스 모두에서 메서드를 호출하면 출력이 동일해야 합니다. 🎜🎜모듈: 🎜rrreeerrreee🎜위 코드에서는 독립 모듈 mymodule.py
에 MyClass
클래스를 정의하고 그 안에 생성합니다. 싱글톤 인스턴스 my_singleton
. 그런 다음 다른 파일 main.py
에서 mymodule
모듈에서 my_singleton
인스턴스를 가져오고 이를 사용하여 say_hello()를 호출합니다.
메소드. 🎜🎜Python 모듈은 처음 가져올 때 자동으로 실행되므로 이 기능을 활용하여 싱글톤 인스턴스를 만들 수 있습니다. mymodule.py
모듈에서는 my_singleton
이 한 번만 생성되고 프로그램의 다른 부분과 공유되도록 할 수 있습니다. 🎜🎜새 메서드: 🎜rrreee🎜위 코드에서는 MyClass
클래스의 생성자를 __new__()
메서드로 변경하고 _instance
를 사용합니다. 싱글톤 인스턴스를 저장하는 code> 클래스 변수입니다. __new__()
메서드에서 _instance
변수를 확인하고 클래스에 아직 인스턴스가 없으면 새 인스턴스를 만들어 _instance. 마지막으로 <code>_instance
에 인스턴스를 반환합니다. 🎜🎜프로그램에서 MyClass
, obj1
및 obj2
의 두 인스턴스를 만든 다음 해당 메모리 주소를 인쇄하여 동일한지 확인합니다. 물체. 마지막으로 두 인스턴스 모두에서 메서드를 호출하면 출력이 동일해야 합니다. 🎜🎜싱글턴 패턴을 구현하는 데 어떤 방법을 사용하더라도 스레드 안전성, 확장성 등의 문제에 주의해야 합니다. 따라서 실제 개발에서는 요구 사항을 신중하게 고려하고 적절한 구현을 선택하십시오. 🎜위 내용은 Python에서 싱글톤 패턴을 구현하는 일반적인 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!