欢迎来到@一夜看尽长安花 博客,您的点赞和收藏是我持续发文的动力
对于文章中出现的任何错误请大家批评指出,一定及时修改。有任何想要讨论的问题可联系我:3329759426@qq.com 。发布文章的风格因专栏而异,均自成体系,不足之处请大家指正。
专栏:
文章概述:对面向对象之单例模式的介绍
关键词:面向对象之单例模式
本文目录:
Python单例模式
单例模式,顾名思义就是只允许类创建一个实例对象
from abc import ABCMeta, abstractstaticmethod
class IPerson(metaclass=ABCMeta):
@abstractstaticmethod
def print_data():
""" implement in child class """
#定义了一个单实例类
class PersonSingleton(IPerson):
#定义了一个私有属性,实例化
__instance = None
#定义了一个静态方法,用来获取实例对象
#如果类对象这个属性没被创建过,就直接按默认的创建,不管这个对象是不是已经存在,
#最终都会返回已经创建的类对象
@staticmethod
def get_instance():
if PersonSingleton.__instance is None:
PersonSingleton("Default name", 0)
return PersonSingleton.__instance
def __init__(self, name, age):
if PersonSingleton.__instance is not None:
# 如果已经存在实例,则抛出异常
raise Exception("Singleton cannot be init more than once")
else:
#初始化属性,确定当前实例对象
self.name = name
self.age = age
PersonSingleton.__instance = self
def print_data(self): # 修正方法名和self的引用
print(f'姓名: {self.name}')
# 示例用法:
# 创建实例 p1
p1 = PersonSingleton("小明", 30)
print(p1)
p1.print_data() # 调用方法打印数据
# 获取现有实例 p3
p3 = PersonSingleton.get_instance()
print(p3)
p3.print_data() # 调用方法打印数据
# 再次创建实例 p2
p2 = PersonSingleton("小红", 25)
print(p2)
p2.print_data() # 调用方法打印数据
代码解释
创建实例:get_instance()
方法在实例不存在时会创建一个新的实例,这实际上会调用 __init__()
方法来完成实例的初始化。
确保单例性:__init__()
方法负责确保只有一个实例被创建,如果已经存在实例,就会抛出异常。而 get_instance()
方法负责检查实例是否存在,并在必要时创建一个新的实例。get_instance()
通过 __init__()
实现实例的创建和初始化,同时保证单例模式。
执行过程:
- 当
PersonSingleton("Default name", 0)
被调用时,__init__()
方法会被执行。 __init__()
方法会初始化实例的属性(例如name
和age
),并将PersonSingleton.__instance
设置为当前实例。- 如果再尝试创建新的实例时,
PersonSingleton.__instance
已经不为None
,则__init__()
方法会抛出异常,防止再次创建实例。
执行顺序
- 第一次调用
get_instance()
:
-
get_instance()
方法首先被调用,检查__instance
是否已经存在。- 如果
__instance
为None
,则get_instance()
会触发__init__()
方法来创建一个新实例。 __init__()
方法被调用,用来实际创建和初始化实例。
- 后续调用
get_instance()
:
-
- 当实例已经被创建后,后续调用
get_instance()
方法时,__instance
不再是None
。 get_instance()
直接返回已经存在的实例,而不再调用__init__()
。
- 当实例已经被创建后,后续调用
总结:
get_instance()
确保访问单例的统一性,而 __init__()
确保实例的唯一性和初始化。