Python——单例使用

举报
bzp123 发表于 2021/06/08 15:12:58 2021/06/08
【摘要】 Python单例的作用:在全局该类只有1个实例。把类设置为单例,那么第一次调用这个类后,已经计算好的属性就存成了静态变量,后面调用该属性就直接用了,不用重复计算了。如果后面再调用的时候,某个属性没被计算过,那么就会进行计算,然后存成静态变量。设置成单例的方法:适用于这个类需要被频繁调用(并且每次的计算开销比较大),这样就不用重复计算了,直接取所需的属性即可。用单例可以提高效率!如果某个属性被...

Python单例的作用:在全局该类只有1个实例。

把类设置为单例,那么第一次调用这个类后,已经计算好的属性就存成了静态变量,后面调用该属性就直接用了,不用重复计算了。如果后面再调用的时候,某个属性没被计算过,那么就会进行计算,然后存成静态变量。
设置成单例的方法:适用于这个类需要被频繁调用(并且每次的计算开销比较大),这样就不用重复计算了,直接取所需的属性即可。用单例可以提高效率!
如果某个属性被修改后,那么在全局这个类属性就都变成了新的值!

单例代码示例:
import threading

def synchronized(func):
    func.__lock__ = threading.RLock()

    def lock_func(*args, **kwargs):
        with func.__lock__:
            return func(*args, **kwargs)

    return lock_func


class Singleton(type):
    _instances = {}

    @synchronized
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(
                Singleton, cls).__call__(
                *args, **kwargs)
        return cls._instances[cls]


import random
class A(object, metaclass=Singleton):
    def __init__(self):
        self.a = random.random()


a = A()
b = A()
print(id(a))  # 139910027848784
print(id(b))  # 139910027848784  即这两个实例对象的地址是一样的!
print(a.a)    # 0.6519248674842676
b.a += 1
print(b.a)    # 1.6519248674842677  
print(a.a)    # 1.6519248674842677  即属性被改变后,全局都改变了!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。