un1queyan

  • 主页
  • 随笔
  • 归档
所有文章 友链 关于我

un1queyan

  • 主页
  • 随笔
  • 归档

单例模式


阅读数: 次    2020-12-25

单例模式

单例模式的作用就是让一个类只有一个实例出现,实际应用场景就是如果在程序运行期间有很多文件都要使用同一个配置文件的内容,这样就会造成内存的浪费。在Python中主要有四种方法实现单例模式

1.使用模块

1
2
3
4
Class Singleton(object):
def foo():
pass
singleton = Singleton()

要使用时直接导入就行了

2.装饰器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

def singleton(cls, *args, **kwargs):
# 创建一个字典来保存类的实例对象
instances = {}

def _singleton():
# 判断这个类有没有对象
if cls not in instances:
instances[cls] = cls(*args, **kwargs) # 创建一个对象并保存在字典中
return instances[cls]
return _singleton

@singleton
class MyClass3(object):
a = 1

one = MyClass3()
two = MyClass3()

print(id(one)) # 2880466769232
print(id(two)) # 2880466769232
print(one == two) # True
print(one is two) # True

3.元类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
在执行metaclass=xx时,会先执行xx类中的__call__方法
class Singleton(type):

def __init__(self, name, bases, dict):
super(Singleton,self).__init__(name,bases, dict)
self._instance = None

def __call__(self, *args, **kwargs):
if self._instance is None:
self._instance = super(Singleton,self).__call__(*args, **kwargs)
return self._instance

class MyClass(object,metaclass=Singleton):
pass

4.__new__方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
"""
可以加把锁防止多线程的时候两个线程同事调用这个方法同时判断存在然后同时创建
"""
class Singleton(object):
__instance = None

def __new__(cls, name, age):
# 如果类属性__instance的值为None,那么就创建一个对象
if not cls.__instance:
cls.__instance = object.__new__(cls)
# 如果已经有实例存在,直接返回
return cls.__instance
a = Singleton("Zhangsan", 18)
b = Singleton("lisi", 20)

print(id(a)) # 2946414454432
print(id(b)) # 2946414454432


a.age = 30 # 给a指向的对象添加一个属性
print(b.age) # 获取b指向的对象的age属性 # 30

默写~

1
2
3
4
5
6
7
8

class A(object):
def __new__(cls,*args,**kwargs):
if not hasattr(cls,'_isinstance'):
cls._isinstance = super(A,cls).__new__(cls,*arg,**kwargs)
return cls._isinstance
class B(A):
pass
1
2
3
4
5
6
7
8
9
10
11
12
13
def func1(func):
_isinstance = {}
def wrapper(*args,**kwargs):
if func not in _isinstance:
_isinstance[func] = func(*args,**kwargs)
return _isinstance[func]

return wrapper
@func1
class B(object):
a =
def __init__(self,x):
self.x = x
赏

老板大气

支付宝
微信
  • 设计模式

扫一扫,分享到微信

微信分享二维码
redis哨兵
类加载过程详解
  1. 1. 单例模式
    1. 1.1. 1.使用模块
    2. 1.2. 2.装饰器
    3. 1.3. 3.元类
    4. 1.4. 4.__new__方法
© 2022 un1queyan
Hexo Theme Yilia by Litten 本站总访问量次
  • 所有文章
  • 友链
  • 关于我

tag:

  • java基础
  • java
  • 随笔
  • Java基础
  • JavaScript
  • mybatis
  • MySQL
  • Nginx
  • spring
  • Shiro
  • django
  • docker
  • elasticsearch
  • 计算机网络
  • linux
  • Linux
  • maven
  • mongodb
  • Django
  • python
  • sqlalchemy
  • redis
  • rabbitMQ
  • 算法练习
  • 设计模式
  • 数据结构
  • jvm
  • 计算机基础

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 友情链接1
  • 友情链接2
  • 友情链接3
  • 友情链接4
  • 友情链接5
  • 友情链接6
很惭愧

只做了一点微小的工作
谢谢大家