is,==的區別
a is b-->判斷a和b是否指向同一塊內存空間
a==b-->判斷a和b指向的空間里的內容是否一樣
深拷貝,淺拷貝
淺拷貝
淺拷貝是對于一個對象的頂層拷貝
拷貝的是內存空間,并不是拷貝內容
深拷貝是對于一個對象所有層次的拷貝(遞歸)
淺拷貝對于不可變和可變類型的copy不同
a=[1,2,3] ? ? ? ? ? ? ? --------------列表
b=copy.copy(a)
這時打印兩個變量的地址不同,如果a附加值,b不會變
a=(1,2,3)
b=copy.copy(a)
這時打印兩個變量的地址一樣,如果a附加,b也會得到相同的值
私有屬性添加getter和setter方法:
classMoney(object):
? ? def__init__(self):
? ? ? ? self.__money =0
? ? defgetMoney(self):
? ? ? ? returnself.__money
? ? defsetMoney(self, value):
? ? ? ? if isinstance(value, int):
? ? ? ? ? ? self.__money = value
? ? ? ? else:
? ? ? ? ? ? print("error:不是整型數字")
使用property升級getter和setter
classMoney(object):
? ? def__init__(self):
? ? ? ? self.__money =0
? ? defgetMoney(self):
? ? ? ? returnself.__money
? ? defsetMoney(self, value):
? ? ? ? ifisinstance(value, int):
? ? ? ? ? ? self.__money = value
? ? ? ? else:
? ? ? ? ? ? print("error:不是整型數字")
? ? money = property(getMoney, setMoney)
運行結果:
In [1]:fromget_setimportMoney
In [2]:
In [2]: a = Money()
In [3]:
使用property取代getter和setter方法
In [3]: a.money
Out[3]:0
In [4]: a.money =100
In [5]: a.money
Out[5]:100
In [6]: a.getMoney()
Out[6]:100
@property成為屬性函數,可以對屬性賦值時做必要的檢查,并保證代碼的清晰短小,主要有2個作用
·將方法轉換為只讀
·重新實現一個屬性的設置和讀取方法,可做邊界判定
classMoney(object):
? ? def__init__(self):
? ? ? ? self.__money =0
? ? @property
? ? defmoney(self):
? ? ? ? returnself.__money
? ? @money.setter
? ? ? ? defmoney(self, value):
? ? ? ? ? ? ifisinstance(value, int):
? ? ? ? ? ? ? ? self.__money = value
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? print("error:不是整型數字")
運行結果
In [3]: a =Money()
In [4]:
In [4]:
In [4]: a.money
Out[4]:0
In [5]: a.money
=100
In [6]: a.money
Out[6]:100