面向对象


对象的复制

变量的赋值操作:只是形成两个变量,实际还是指向同一个对象

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
'''