单例模式
单例模式(Singleton Pattern)的核心作用是确保一个类只有一个实例,并且提供一个访问该实例的全局访问点。
单例模式只生成一个实例对象,减少了对系统资源的开销。当一个对象的产生需要比较多的资源,如读取配置文件、产生其他依赖对象时,可以产生一个“单例对象”,然后永久驻留内存中,从而极大的降低开销。
单例模式有多种实现的方式,我们这里推荐重写__new__()
的方法。
#单例模式
class MySingleton:
__obj = None
__init_flag = True
def __new__(cls, *args, **kwargs):
if cls.__obj == None:
cls.__obj = object.__new__(cls)
return cls.__obj
def __init__(self,name):
if MySingleton.__init_flag:
print("init....")
self.name = name
MySingleton.__init_flag = False
a = MySingleton("aa")
print(a)
b = MySingleton("bb")
print(b)
运算结果:
init....
<__main__.MySingleton object at 0x01E15610>
<__main__.MySingleton object at 0x01E15610>
补充:可变参数
*args
和 **kwargs
是用于在 Python 函数或方法中处理可变数量的参数的特殊语法。
-
*args
是用于传递不定数量的位置参数(Positional Arguments)。在函数定义中,*args
表示可以接受任意数量的位置参数,并将它们作为一个元组(tuple)传递给函数。调用函数时,可以传递任意数量的位置参数,它们将被打包成一个元组传递给*args
。
例如,以下函数接受任意数量的位置参数并将它们相加:
def add_numbers(*args):
total = 0
for num in args:
total += num
return total
调用方式示例:
result = add_numbers(1, 2, 3, 4) # result = 10
result = add_numbers(10, 20, 30, 40, 50) # result = 150
-
**kwargs
是用于传递不定数量的关键字参数(Keyword Arguments)。在函数定义中,**kwargs
表示可以接受任意数量的关键字参数,并将它们作为一个字典(dictionary)传递给函数。调用函数时,可以传递任意数量的关键字参数,它们将被打包成一个字典传递给**kwargs
。
例如,以下函数接受任意数量的关键字参数并打印它们的键值对:
def print_kwargs(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
调用方式示例:
print_kwargs(name="John", age=30, city="New York")
# 输出:
# name: John
# age: 30
# city: New York
需要注意的是,*args
和 **kwargs
可以与其他参数一起使用,但通常放在参数列表的最后。例如:
def example_func(arg1, arg2, *args, **kwargs):
# 函数体
在函数定义中,参数的顺序应为:必需参数,*args
,关键字参数,**kwargs
。这样,函数可以接受位置参数、不定数量的位置参数、关键字参数以及不定数量的关键字参数。