為了加深對(duì)面向?qū)ο蟮睦斫猓聪旅娴拇a
定義了一個(gè)烤的類(lèi)。初始化默認(rèn)為烤了0分鐘,烤的情況是生的,調(diào)料列表也是空的。對(duì)象轉(zhuǎn)化為字符串時(shí)輸出烤地瓜的時(shí)間,烤的情況,以及加入的調(diào)料。定義一個(gè)烤的方法,根據(jù)對(duì)象傳遞的時(shí)間判斷烤的情況。如果烤熟了,則調(diào)用添加調(diào)料addcondiments()的方法添加調(diào)料。創(chuàng)建一個(gè)digua1的對(duì)象來(lái)測(cè)試輸出。結(jié)果如下:
接下來(lái),涉及到對(duì)象的傳遞,先進(jìn)行一個(gè)簡(jiǎn)單的例子:
在調(diào)用a.test(b)這個(gè)方法時(shí),item同時(shí)指向了b指向的地址,所以對(duì)item.num重新復(fù)制,也就同時(shí)改變了b的值。所以出現(xiàn)了上圖所示的結(jié)果。這就是對(duì)象的傳遞。
下面將測(cè)試一下對(duì)象的傳遞
也就是說(shuō)如果一個(gè)對(duì)象與另一個(gè)對(duì)象有一定的關(guān)系,那么一個(gè)對(duì)象可以用另一個(gè)對(duì)象的屬性。
保護(hù)對(duì)象的屬性
如果一個(gè)對(duì)象需要對(duì)其屬性進(jìn)行修改時(shí),有兩種方法:
一種是??????對(duì)象名.屬性=數(shù)據(jù)???-----???直接修改
另一種是????對(duì)象名.方法名()????-----???間接修改
為了更好的保護(hù)屬性的安全,不建議使用第一種方法,一般處理的方式是將屬性定義為私有屬性,添加一個(gè)可以調(diào)用的方法,供調(diào)用。
錯(cuò)誤顯示沒(méi)有這個(gè)屬性。
解決辦法:
可以通過(guò)調(diào)用方法訪問(wèn)到屬性,因此可以在方法里設(shè)置約束條件進(jìn)行判斷
?
Python中沒(méi)有像C++中public和private這些關(guān)鍵字來(lái)區(qū)別公有屬性和私有屬性。它是以屬性命名方式來(lái)區(qū)分,如果在屬性名前面加了2個(gè)下劃線'__',則表明該屬性是私有屬性,否則為公有屬性(方法也是一樣,方法名前面加了2個(gè)下劃線的話表示該方法是私有的,否則為公有的)。
創(chuàng)建對(duì)象后,python解釋器默認(rèn)調(diào)用__init__()方法;當(dāng)刪除一個(gè)對(duì)象時(shí),python解釋器也會(huì)默認(rèn)調(diào)用一個(gè)方法,這個(gè)方法為_(kāi)_del__()方法。__del__()會(huì)在對(duì)象被垃圾回收時(shí)被調(diào)用,該方法可以釋放資源,比如文件的連接,數(shù)據(jù)庫(kù)的連接等。
import?sys
class?Student:
def?__init__(self,name):
print('__init__')
self.__name=name
def?__del__(self):
print('__del__')
stu1=Student('Tony')
stu2=stu1
#獲取對(duì)象的引用數(shù)量,多一個(gè)
print(sys.getrefcount(stu1))
del?stu1
#獲取對(duì)象的引用數(shù)量,多一個(gè)
print(sys.getrefcount(stu1))
運(yùn)行結(jié)果顯示為
如果改為獲取stu2的引用數(shù)量,刪除stu1后,那結(jié)果為
可以看出stu1和stu2的引用數(shù)量是相同的,由于刪除stu1后,系統(tǒng)找不到所以會(huì)報(bào)錯(cuò),而刪除stu1對(duì)stu2沒(méi)有影響,所以引用數(shù)量為2。
也就是說(shuō)當(dāng)有一個(gè)變量保存了對(duì)象的引用后,此對(duì)象的引用就會(huì)加1。當(dāng)使用del刪除變量指向的對(duì)象時(shí),如果對(duì)象的引用計(jì)數(shù)不為1,則減1,調(diào)用引用計(jì)數(shù)被刪除的變量時(shí)會(huì)報(bào)錯(cuò),而調(diào)用未被刪除的變量時(shí)依然顯示刪除完之后的結(jié)果。