- 一隔箍、單例模式
- new與init的區(qū)別:
- __new:創(chuàng)建實例對象時調(diào)用的構(gòu)造方法
- init:初始化方法谓娃,用于設(shè)置實例的相關(guān)屬性
- python創(chuàng)建實例時,會先調(diào)用new構(gòu)造方法蜒滩,然后使用init進(jìn)行實例初始化滨达。
- 我們可以通過new來影響實例的創(chuàng)建,從而實現(xiàn)單例俯艰。
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,當(dāng)__instance不為None時,代表系統(tǒng)中已有實例竹握,直接返回該實例稽莉,若__instance為None時,表示系統(tǒng)中還沒有該類實例,則創(chuàng)建新實例并返回污秆。
二劈猪、私有化
xx :公開屬性
class Test(object):
def __init__(self):
#這是一個公開屬性
self.num = 100
from a import *
test = Test()
print(test.num)
_xx :模塊內(nèi)可以訪問的屬性這個的作用是該屬性只能在當(dāng)前模塊中使用,出了模塊及不能使用
class Test(object):
def __init__(self):
#這是一個模塊屬性
self._num = 100
test = Test()
print(test._num)
__xx :通常是類的私有屬性
class Test(object):
def __init__(self):
#這是一個私有屬性
self.__num = 100
#當(dāng)前模塊中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
- 四良拼、深拷貝和淺拷貝
淺拷貝
淺拷貝是對于一個對象的頂層拷貝
通俗的理解是:拷貝了引用战得,并沒有拷貝內(nèi)容
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]
當(dāng)b = a時,實際上是將a列表的內(nèi)存地址賦值給了b庸推,那么變量a與變量b指向的是同一內(nèi)存地址常侦!
深拷貝
深拷貝是對于一個對象所有層次的拷貝(遞歸)
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]
- 深拷貝不僅拷貝引用還拷貝值,所以內(nèi)存地址不一樣贬媒!