IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python基础之单例模式 -> 正文阅读

[Python知识库]python基础之单例模式

Python基础之单例模式

1.单例模式

1.单例模式
	1.init和new
	__init__,实例化对象 最先调用的不是__init__方法,而是__new__方法
	2.步骤
		类名() 实例化对象时,python解释器首先会调用new方法为对象分配空间,然后在执行init方法初始化
		new方法作用:1.在内存中为对象分配空间 2.返回对象的引用(python解释器获取对象后将引用作为第一个参数传给init)
	3.总结
		1.init方法是实例化的时候调用
		2.new方法是创建对象的时候调用,基于object
		3.self 代表实例对象本身,是由new 方法创建,传给init使用的
		4.new  创建对象 	   init 初始化对象
		5.new  返回对象引用 init:定义实例属性
		6.new  类级的方法   init:实例级别的方法
	4.单例模式
		1.是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例的存在
			当你希望在整个系统中,某个类只能出现一个实例时,单例对象就派上用场了
		2.单例模式: 一个特殊的类,这个类只能创建一次实例
			实例对象,内存地址不同, 单例模式可以节省内存空间,实例不同对象是同一个地址
			实现单例模式的方法:
				1.@classmthod
				2.通过装饰器实现
				3.通过__new__实现
				4.通过导入模块
	3.单例模式设计流程:每次实例化创建的对象都是同一个地址
				1.定义一个类属性,初始值为None,用于记录单例对象的引用
				2.重写new的方法
				3.如果类属性是None,把new方法,返回的对象引用保存
				4.返回类属性中记录的对象引用
#1.init和new
#__init__,实例化对象,最先调用的不是__init__方法,而是__new__方法
class Test(object):
    def __init__(self):
        print('这是init方法')
t=Test()#这是init方法
#2.步骤
#类名() 实例化对象时,python解释器首先会调用new方法为对象分配空间,然后在执行init方法初始化
#new方法作用:
    # 1.在内存中为对象分配空间
    # 2.返回对象的引用(python解释器获取对象后将引用作为第一个参数传给init)
#重写
class A(object):
    def __init__(self):#self 代表实例化本身
        print('这是init方法')
    def __new__(cls, *args, **kwargs):
        print('new方法中cls',cls)
a=A()#这是init方法 new方法中cls <class '__main__.A'>
print(a)#  None 此相当于重写了__new__方法,对象引用没有传参
#扩展
class B(object):
    def __init__(self):
        print('这是init__方法')
    def __new__(cls, *args, **kwargs):
       #扩展 1.父类.方法名() 2.super().方法名()
        res=object.__new__(cls)
        print(res)# <__main__.B object at 0x00000227C8155240>
        print('这是new方法')# 这是new方法
        return res# 这是init__方法
b=B()
class Human(object):
    def __init__(self,name):
        self.name=name#实例属性
        print('这是init中的self',self)
        print('名字是',self.name)
    def __new__(cls, *args, **kwargs):
        print('这是new中的cls',cls)
        print('这是new中需要的返回值',object.__new__(cls))
        return object.__new__(cls)#返回对象引用
print('这是类:',Human)
h=Human('python')# 实例化对象
print('这是实例化的对象',h)
'''
这是类: <class '__main__.Human'>
这是new中的cls <class '__main__.Human'>
这是new中需要的返回值 <__main__.Human object at 0x000001A8133C6470>
这是init中的self <__main__.Human object at 0x000001A8133C6470>
名字是 python
这是实例化的对象 <__main__.Human object at 0x000001A8133C6470>'''

# new方法
class Exam(object):
    #记录第一个被创建的对象引用
    ins=None# 类属性
    def __init__(self):
        print('这是init')
    def __new__(cls, *args, **kwargs):
        #判断类属性是否为空
        if cls.ins==None:
            cls.ins=object.__new__(cls)#调用父类方法为第一个对象分配空间
        return cls.ins# 返回类属性保存的对象的引用
a1=Exam()
print(a1)# <__main__.Exam object at 0x000001EA36356668>
a2=Exam()
print(a2)# <__main__.Exam object at 0x000001EA36356668>

#2.通过装饰器实现
#装饰函数
def out(fn):#fn 是类名
    ins={}
    def inner():
        #判断是否已经实例化
        if fn not in ins:
            fn()#实例化对象
            print('装饰器中的fn()',fn())# 装饰器中的fn() <__main__.Test object at 0x0000026811AA5278>
            print('装饰器中的fn',fn)# 装饰器中的fn <class '__main__.Test'>
            ins[fn]=fn()# 保存实例化对象地址
            print('装饰器中的ins', ins) # 装饰器中的ins {<class '__main__.Test'>: <__main__.Test object at 0x0000023B2A4A0710>}
            print('装饰器中的ins[fn]',ins[fn])# 装饰器中的ins[fn] <__main__.Test object at 0x0000026811AA5278>
        #返回保存的实例化对象的引用
        return ins[fn]
    return inner
#被装饰类
@out
class Test(object):
    pass
t=Test()#实例对象
print(t)# <__main__.Test object at 0x000001B670E36470>
t1=Test()
print(t1)# <__main__.Test object at 0x000001B670E36470>

2.魔术方法

__doc__:类的描述信息
__module__:表示当前操作的对象在哪个模块
__class__:表示当前操作的对象的类是什么
__str__:对象的描述信息

#1。__doc__:类的描述信息 引用三引号
class A(object):
    '''这是类的描述信息'''
    pass
print(A.__doc__)# 这是类的描述信息

#2.__str__  对象描述信息系
# 如果对象中定义了str方法,那么在打印对象时,默认输出该方法的返回值
#__str__ 方法必须返回一个字符串
class B(object):
    def __str__(self):
        return '这是对象描述信息' #返回值必须是字符串
b=B()
print(b)# <__main__.B object at 0x00000247AD3F61D0>
print(b)# 这是对象描述信息
#3._module__:表示当前操作的对象在哪个模块
#4.__class__:表示当前操作的对象的类是什么
# from testmokuai import C
# t=C()
import testmokuai
t=testmokuai.C()#类的实例化
print(t)#实例对象 <testmokuai.C object at 0x00000137EC5161D0>
print(t.__module__)#哪个模块  testmokuai
print(t.__class__)#哪个类  <class 'testmokuai.C'>



  • 菩萨畏因,凡人畏果
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-13 11:58:44  更:2021-08-13 12:00:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 18:34:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码