title: python一个类有几个类对象 date: 2022-01-06 11:54:28 categories:
- IT技术
- 编程语言
- python tags:
- IT技术
- 编程语言
- 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))
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类和对象实验报告,python类和对象实验 ———————————————— 版权声明:本文为CSDN博主「weixin_39755625」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_39755625/article/details/111418087