- 一、单例模式
- new与init的区别:
- __new:创建实例对象时调用的构造方法
- init:初始化方法,用于设置实例的相关属性
- python创建实例时,会先调用new构造方法,然后使用init进行实例初始化。
- 我们可以通过new来影响实例的创建,从而实现单例。
class A(object):
__instance = None
def __new__(cls,*args,**kwargs):
if not cls. __instance:
cls.__instance = super().__new__(cls,*args,**kwargs)
return cls.__instance
a = A()
b = A()
print(a == b)
print(id(a) == id(b))
上面代码中,声明了一个私有类变量__instance,当__instance不为None时,代表系统中已有实例,直接返回该实例,若__instance为None时,表示系统中还没有该类实例,则创建新实例并返回。
二、私有化
xx :公开属性
class Test(object):
def __init__(self):
#这是一个公开属性
self.num = 100
from a import *
test = Test()
print(test.num)
_xx :模块内可以访问的属性这个的作用是该属性只能在当前模块中使用,出了模块及不能使用
class Test(object):
def __init__(self):
#这是一个模块属性
self._num = 100
test = Test()
print(test._num)
__xx :通常是类的私有属性
class Test(object):
def __init__(self):
#这是一个私有属性
self.__num = 100
#当前模块中Test类可以访问
- 三、==和is
>>> a = 1
>>> b = 1.0
>>> a is b
False
>>> a == b
True
>>> id(a)
12777000
>>> id(b)
14986000
>>> a = 1
>>> b = 1
>>> a is b
True
>>> a == b
True
>>> id(a)
12777000
>>>id(b)
12777000
- 四、深拷贝和浅拷贝
浅拷贝
浅拷贝是对于一个对象的顶层拷贝
通俗的理解是:拷贝了引用,并没有拷贝内容
In [10]: a = [11,22,33]
In [11]: b = a
In [12]: id(a)
Out[12]: 140343572333832
In [13]: id(b)
Out[13]: 140343572333832
In [14]: a[0] = 'aa'
In [15]: a
Out[15]: ['aa', 22, 33]
In [16]: b
Out[16]: ['aa', 22, 33]
当b = a时,实际上是将a列表的内存地址赋值给了b,那么变量a与变量b指向的是同一内存地址!
深拷贝
深拷贝是对于一个对象所有层次的拷贝(递归)
In [17]: import copy
In [18]: c = copy.deepcopy(a)
In [19]: id(a)
Out[19]: 140343572333832
In [20]: id(c)
Out[20]: 140343572336840
In [21]: a
Out[21]: ['aa', 22, 33]
In [22]: c
Out[22]: ['aa', 22, 33]
In [23]: a[0] = 11
In [24]: a
Out[24]: [11, 22, 33]
In [25]: c
Out[25]: ['aa', 22, 33]
- 深拷贝不仅拷贝引用还拷贝值,所以内存地址不一样!
网友评论