对象的复制
变量的赋值操作:只是形成两个变量,实际还是指向同一个对象
class A:
pass
a1 = A()
a2 = A()
a3 = a1
#可以通过id来判断,对象是否一致
print('a1对象',a1)
print('a2对象',a2)
print('a3对象',a3)
print('a1和a2对象是否相等',id(a1)==id(a2)) # a1和a2对象是否相等 False
#变量的赋值操作:只是形成两个变量,实际还是指向同一个对象。
print('a1和a3对象是否相等',id(a1)==id(a3)) # a1和a3对象是否相等 True
浅拷贝
拷贝时,对象包含的子对象内容不拷贝。因此源对象和拷贝对象会引用同一个子对象
import copy
class B:
pass
class A:
def __init__(self):
self.v = B()
a1 = A()
a2 = copy.copy(a1)
print('a1对象',a1)
print('a2对象',a2)
print('a1和a2对象是否相等',id(a1)==id(a2)) # a1和a2对象是否相等 False
#拷贝时,对象包含的子对象内容不拷贝。因此源对象和拷贝对象会引用同一个子对象
print('a1的v和a2的v是否相等',id(a1.v)==id(a2.v)) # a1的v和a2的v是否相等 True
深拷贝
使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象。源对象和拷贝对象所有的子对象也不同
import copy
class B:
pass
class A:
def __init__(self):
self.v = B()
a1 = A()
a2 = copy.deepcopy(a1)
print('a1对象',a1)
print('a2对象',a2)
print('a1和a2对象是否相等',id(a1)==id(a2)) # a1和a2对象是否相等 False
#使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象。源对象和拷贝对象所有的子对象也不同
print('a1的v和a2的v是否相等',id(a1.v)==id(a2.v)) # a1的v和a2的v是否相等 False
单例设计模式
class A:
__instance = None
__flag = False
def __new__(cls, *args, **kwargs):
print("new执行了")
if cls.__instance == None:
cls.__instance = super().__new__(cls)
return cls.__instance
def __init__(self):
if not A.__flag:
print("init执行了")
A.__flag = True
a1 = A()
a2 = A()
print(id(a1) == id(a2)) # True
#执行结果:
'''
new执行了
init执行了
new执行了
True
'''