zoukankan      html  css  js  c++  java
  • python 基于元类的单例

    创建元类的基类(Singleton)
    `
    from threading import RLock

    class SingletonType(type):
    single_lock = RLock()

    def __call__(cls, *args, **kwargs):
        with SingletonType.single_lock:
            if not hasattr(cls, '_instance'):
                cls._instance = super(SingletonType, cls).__call__(*args, **kwargs)
        return cls._instance
    

    class Singleton(metaclass=SingletonType):
    def init(self, name):
    self.name = name

    `

    • Rlock 是python 的重入锁(文末有锁的区别)
    • Singleton 是一个基类,只需要在需要单例的类继承此类即可实现单例类
    • SingletonType 只实现了 call 方法,super 不可以替换为 cls , 替换会形成死循环

    s1 = Singleton('1 create') print(s1.name, id(s1)) s2 = Singleton('2 create') print(s2.name, id(s2))
    运行结果:

    super 替换为 cls 后运行引发的错误

    常规锁和Python中的Rlock之间的一个区别是,常规锁可以由不同的线程释放,而重入锁必须由获取它的同一个线程释放,同时要求解锁次数应与加锁次数相同,才能用于另一个线程。另外,需要注意的是一定要避免在多个线程之间拆分锁定操作,如果一个线程试图释放一个尚未获取的锁,Python将引发错误并导致程序崩溃。

    LESS IS MORE !
  • 相关阅读:
    JDBC
    初识JAVA
    初入门 HTML
    jsp数据交互(一).3
    jsp数据交互(一).2
    jsp数据交互(一).1
    jsp的简介(1)
    Android实现数据存储技术
    Android数据存储五种方式总结
    SD卡操作
  • 原文地址:https://www.cnblogs.com/maxiaohei/p/14583858.html
Copyright © 2011-2022 走看看