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.返回类属性中记录的对象引用
class Test(object):
def __init__(self):
print('这是init方法')
t=Test()
class A(object):
def __init__(self):
print('这是init方法')
def __new__(cls, *args, **kwargs):
print('new方法中cls',cls)
a=A()
print(a)
class B(object):
def __init__(self):
print('这是init__方法')
def __new__(cls, *args, **kwargs):
res=object.__new__(cls)
print(res)
print('这是new方法')
return res
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>'''
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)
a2=Exam()
print(a2)
def out(fn):
ins={}
def inner():
if fn not in ins:
fn()
print('装饰器中的fn()',fn())
print('装饰器中的fn',fn)
ins[fn]=fn()
print('装饰器中的ins', ins)
print('装饰器中的ins[fn]',ins[fn])
return ins[fn]
return inner
@out
class Test(object):
pass
t=Test()
print(t)
t1=Test()
print(t1)
2.魔术方法
__doc__:类的描述信息
__module__:表示当前操作的对象在哪个模块
__class__:表示当前操作的对象的类是什么
__str__:对象的描述信息
class A(object):
'''这是类的描述信息'''
pass
print(A.__doc__)
class B(object):
def __str__(self):
return '这是对象描述信息'
b=B()
print(b)
print(b)
import testmokuai
t=testmokuai.C()
print(t)
print(t.__module__)
print(t.__class__)
|