Python中多个类共用一个对象 单列模式 Python易混知识点整理

鳄鱼君

发表文章数:523

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python教程 » Python中多个类共用一个对象 单列模式 Python易混知识点整理

现在有一个类,我创建10个对象占的内存多还是创建1个对象占的内存多,肯定是前者更占内存。如果这一个类是已经固定的,那么创建很多的类就会非常好用内存,现在能不能让所有的对象都是用一个类?所有的对象都使用一个类叫做单列模式,为了更好的说明其含义,可以通过下面的列子来认识。在Python中创建一个类,然后创建两个对象obj1和obj2,代码如下:

class Foo(object):
    def __init__(self):
	self.name='鳄鱼君Ba:www.e1yu.com'
    def process(self):
	return '123'
obj1=Foo()
print(obj1.process())
   

obj2=Foo()
print(obj2.process())

可以看到我们在init初始化的时候,参数是固定,也就是说obj1中有一个name,obj2也是如此,那么现在我们可以封装为一个,这样避免了内存消耗:

单列模式第一种方式

class Foo(object):
    instance=None #静态字段只属于类,只创建一份
    def __init__(self):
	self.name='鳄鱼君Ba:www.e1yu.com'
    @classmethod   #类方法
    def get_instance(cls):
	if Foo.instance:
	    return Foo.instance
	else:
	    Foo.instance=Foo()
	    return Foo.instance
    def process(self):
	return '123'
obj1=Foo()
obj2=Foo()

print(id(obj1),id(obj2))

我们打印两个对象的id,很显然两个对象的id是不同的,现在我们只需要修改创建对象的方法即可:

obj1=Foo.get_instance()
obj2=Foo.get_instance()

print(id(obj1),id(obj2))

现在再来打印一下两者的id,你会返现两个对象的id是一样的,问什么会一样?第一次instance为None,所以会执行else语句,创建Foo()并赋值给instance,第一次执行完成,instance就会被赋值为Foo(),第二次开始会进入if语句,直接拿到并返回。以上方式比较Low,因为我们创建对象非常麻烦,对于用户来说他不像这样你也没办法,所以不行。

单列模式第二种方式

class Foo(object):
    instance=None
    def __init__(self):
        self.name='鳄鱼君Ba:www.e1yu.com'
    def __new__(cls,*args,**kwargs):
        return '123'
obj1=Foo()
print(obj1)

obj1=Foo()会先执行new方法,new里边返回什么,这个obj1就等于什么,通过上面的代码你可以清楚的看到结果。呢现在这个对象竟然称为字符串了,不应该呐。

class Foo(object):
    instance=None
    def __init__(self):
        self.name='鳄鱼君Ba:www.e1yu.com'
    def __new__(cls,*args,**kwargs):
        obj=object.__new__(cls,*args,**kwargs)
        return obj
obj1=Foo()
print(obj1)

通过上面的代码,我们可以看到obj1已经成为了对象,本质上的构造方法就是new,执行了new才执行init,也就是说去掉new是一样的效果。为了证明这句话,你可以在new中打印一个内容,然后再init中也打印一个内容,肯定会先打印new中的,在打印init中的。现在就好办了,简单修改一下代码:

class Foo(object):
    instance=None
    def __init__(self):
        self.name='鳄鱼君Ba:www.e1yu.com'
    def __new__(cls,*args,**kwargs):
        if Foo.instance:
            return Foo.instance
        else:
            Foo.instance=object.__new__(cls,*args,**kwargs)
            return Foo.instance
obj1=Foo()
obj2=Foo()
print(id(obj1),id(obj2))

现在两个对象的id值仍然是相同的,我们既没有改变用户的创建方式,也实现了单列模式,自己动手尝试一下吧!

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《Python中多个类共用一个对象 单列模式 Python易混知识点整理》 发布于2020-05-04

分享到:
赞(0) 赏杯咖啡

评论 抢沙发

2 + 6 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册