目录

python知识点介绍一

python知识点介绍一

在OOP中,有一种模式称之为单例模式。这个模式是指让一个类只能创建唯一的对象实例。让别的类在使用这个单例类时,不会引发冲突,导致运行混乱。

Python语言有2种方式实现单例,装饰器和元类。

装饰器方式

装饰器方式是隶属python中很有特色的语法,写法上很类似于java的annotation,但是两者本质是不同的。python装饰器相当于高阶函数,将函数本身当作操作数据对象,进行逻辑编程。java的annotation是元数据。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
from functools import wraps

def singleton(cls):
    """单例类装饰器"""
    instances = {}

    @wraps(cls)
    def wrapper(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]

    return wrapper


@singleton
class President:
    pass

装饰器的注意事项

前述使用装饰器的单例模式,不是线程安全的。如果要求线程安全,需要使用threading的RLock对象加锁处理。使用锁对象的acquire和release方法来实现加锁和解锁的操作。当然,更为简便的做法是使用锁对象的with上下文语法来进行隐式的加锁和解锁操作

使用元类的单例模式

在OOP中,对象通过类创建,类本身也是对象,类本身是通过元类来创建。在定义类时,如果没有指定父类,那么默认父类是object,如果没有给类指定元类,那么默认元类是type。通过自定义元类,我们可遗改变一个类的默认行为。

单例模式应用场景

通常如果一个对象的状态要被其他对象共享访问,就可以将其设计为单例。例如项目中数据库连接池和配置对象。这样能保证其他处理对象访问的数据库连接和配置信息是一致的。而且由于对象实例只有首次创建,不用重复创建,避免了重复创建、销毁对象的时间和空间开销。一般来说,项目中日志对象是单例,因为日志对象总是要可写可读的,如果重复创建日志对象,可能造成日志数据源的混乱和污染。