python中单例模式的实现-通过闭包函数和魔术方法__new__实现单例模式

1、通过闭包函数实现单例模式:

# 使用闭包函数实现单例
def single(cls, *args, **kwargs):
    instance = {}

    def get_instance():
        if cls not in instance:
            instance[cls] = cls(*args, **kwargs)
        return instance[cls]
    return get_instance

@single
class Apple:
    pass

a = Apple()
b = Apple()
print(id(a))
print(id(b))

2、通过python中魔术方法__new__实现单例模式:

class Single:
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, ‘_instance‘):
            cls._instance = super(Single, cls).__new__(cls)
        return cls._instance

s1 = Single()
s2 = Single()
print(id(s1))
print(id(s2))

原文地址:https://www.cnblogs.com/benben-wu/p/12158397.html

时间: 2024-08-28 09:06:45

python中单例模式的实现-通过闭包函数和魔术方法__new__实现单例模式的相关文章

Python中内置类型和定义了__nonzero__的魔术方法的类都能在if语句中呗解释为True或False

1 >>> a =[1,2,3] 2 >>> if a: 3 print('I found something') 4 5 6 I found something 7 >>> b = [] 8 >>> if not b: 9 print('Empty') 10 11 12 Empty 13 >>> b = [] 14 >>> if b: 15 print('Empty') 16 17 18 >

Python中的10个常见安全漏洞及修复方法

编写安全的代码很困难,当你学习一门编程语言.一个模块或框架时,你会学习其使用方法.在考虑安全性时,你需要考虑如何避免代码被滥用,Python也不例外,即使在标准库中,也存在着许多糟糕的实例.然而,许多 Python 开发人员却根本不知道这些. 以下是我总结的10个Python常见安全漏洞,排名不分先后. 1.输入注入 注入***影响广泛且很常见,注入有很多种类,它们影响所有的语言.框架和环境. SQL 注入是直接编写 SQL 查询(而非使用 ORM) 时将字符串与变量混合.我读过很多代码,其中"

python中“生成器”、“迭代器”、“闭包”、“装饰器”的深入理解

一.生成器 1.什么是生成器? 在python中,一边循环一边计算的机制,称为生成器:generator. 2.生成器有什么优点? 1.节约内存.python在使用生成器时对延迟操作提供了支持.所谓延迟,是指在需要的时候才产生结果,而不是立即产生结果.这样在需要的时候才去调用结果,而不是将结果提前存储起来要节约内存.比如用列表的形式存放较大数据将会占用不少内存.这是生成器的主要好处.比如大数据中,使用生成器来调取数据结果而不是列表来处理数据,因为这样可以节约内存. 2.迭代到下一次的调用时,所使

零基础学python-7.1 python中的字符串简介与常用函数

在python中,字符串变成了一个强大的处理工具集,他是不可变的,也就是说字符串包含字符与字符的顺序,他不可以原处修改 字符串是我们后面需要学习的稍大一点的对象类别--序列的第一个代表 在字符串章节所说到的关于序列的操作,后面的列表与元组一样适用 字符串常用的一些操作与函数 操作 解释 s='' 空字符串 s="abc'd" 双引号和单引号相同 s='abc\n' 转义序列,使用变量完全显示字符, 只有使用print函数才能够显示转义 s="""aaaaa

python中的作用域以及内置函数globals()-全局变量、locals()-局部变量

在python中,函数会创建一个自己的作用域,也称为为命名空间.这意味着在函数内部访问某个变量时,函数会优先在自己的命名空间中寻找. 通过内置函数globals()返回的是python解释器能知道的变量名称的字典(变量名:值): 而locals()函数返回的是函数内部本地作用域中的变量名称字典.由此可以看出,函数都是由自己独立的命名空间的. 查看全局变量和局部变量: #coding=utf-8 outerVar="this is a global variable"def test()

python中使用shell命令及常用函数

操作: 导入模块 subprocess import subprocess zhi = subprocess.getoutput('ls') 1. subprocess模块中的常用函数 函数 描述 subprocess.run() Python 3.5中新增的函数.执行指定的命令,等待命令执行完成后返回一个包含执行结果的CompletedProcess类的实例. subprocess.call() 执行指定的命令,返回命令执行状态,其功能类似于os.system(cmd). subprocess

python中的set(),zip()以及map()函数

set.zip和map函数均为python的内置函数. (1)set()      用法:set(interable)  用来创建一个无序不重复元素的集合.可以对其进行集合的一系列操作,例如求差集.并集和补集,利用这一特性可删除重复数据.探索元素之间的关系等.此外还可以进行len操作,返回集合中元素的个数. a = '1234' b = '11m' #由于集合中的元素是无序的,所以set函数每次输出的结果中的元素顺序是不一致的 x = set(a) ## 输出{'4', '2', '1', '3

python中List添加、删除元素的几种方法

一.python中List添加元素的几种方法 List 是 Python 中常用的数据类型,它一个有序集合,即其中的元素始终保持着初始时的定义的顺序(除非你对它们进行排序或其他修改操作).在Python中,向List添加元素,方法有如下4种方法(append(),extend(),insert(), +加号). 1. append() 追加单个元素到List的尾部,只接受一个参数,参数可以是任何数据类型,被追加的元素在List中保持着原结构类型.此元素如果是一个list,那么这个list将作为一

char函数绕过魔术方法注入

我目前学习到的绕过魔术引号的几种方法(如果知道还有别的请万望告之): 1.倘若服务端是GBK可以尝试宽字节注入 2.使用char函数绕过魔术引号进行注入 3.同char函数类似的函数,例如bin(转换为2进制),或者oct(转换为8进制) 本篇就是介绍char函数来进行绕过魔术引号来注入. 假设:select * from user where username = 'def'; 是可以等价于:select * from user where username = char(100,101,10