一、強調(diào)引用的概念
在面向?qū)ο箝_發(fā)中,引用的概念是同樣適用的。
在python中使用類創(chuàng)建對象后,tom變量中仍然記錄的是對象在內(nèi)存中的地址,也就是tom變量引用了新建的貓對象。
使用print輸出對象變量,默認情況下,是能夠輸出這個變量引用的對象是由哪一個類創(chuàng)建的對象,以及在內(nèi)存中的地址(十六進制表示)
提示: 在計算機中,通常使用十六進制表示內(nèi)存地址。
- (1) 十進制和十六進制都是用來表達數(shù)字的,只是表示的方式不一樣
- (2) 十進制和十六進制的數(shù)字之間可以來回轉(zhuǎn)換
%d可以以十進制輸出數(shù)字
%x可以以十六進制輸出數(shù)字
代碼:
class Cat:
def eat(self):
print("小貓愛吃魚")
def drink(self):
print("小貓要喝水")
# 創(chuàng)建貓對象名字叫tom
tom = Cat()
# 調(diào)用對象的方法
tom.eat()
tom.drink()
# 使用print輸出對象變量
print(tom)
# 利用函數(shù)id()查詢數(shù)據(jù)在內(nèi)存中的地址
addr = id(tom)
print("%d" % addr) # %d可以以十進制輸出數(shù)字
print("%x" % addr) # %x可以以十六進制輸出數(shù)字
執(zhí)行結(jié)果:
main:后面介紹模塊時候再詳細的說明一下
Cat:這個是上面代碼中創(chuàng)建的貓類:
object:表示對象的意思
0x0000000002901160:內(nèi)存地址
Cat object at 0x0000000002901160:貓類創(chuàng)建的對象地址是0x0000000002901160
二、案例進階
需求:使用Cat類再創(chuàng)建一個對象black
問題1:tom和black是同一個對象嗎?
問題2:black_2 和 black是什么關(guān)系?
代碼驗證:
class Cat:
def eat(self):
print("小貓愛吃魚")
def drink(self):
print("小貓要喝水")
# 創(chuàng)建貓對象名字叫tom
tom = Cat()
# 調(diào)用對象的方法
tom.eat()
tom.drink()
print(tom)
# 再創(chuàng)建一個對象叫black
black = Cat()
black.eat()
black.drink()
print(black)
black_2 = black
print(black_2)
執(zhí)行結(jié)果:
問題1答案:tom和black是同一個對象,因為從執(zhí)行結(jié)果可以看出對象的地址是一樣的
問題2答案:black_2和black是同一個對象同一個貓,因為從執(zhí)行結(jié)果可以看出對象的地址是一樣的
在第22行代碼中,在內(nèi)存中為black分配一個小格子,然后把black這個標簽貼在了這個小格子身上,在第29行代碼,讓black_2等于black就想象等把black_2也貼在了這個小格子身上。不管black_2也好還是black也好都是同一只貓。
總結(jié):在使用面向?qū)ο箝_發(fā)程序時,類可以只有一個,但是可以使用相同的類創(chuàng)建出很多個不同的對象。
三、方法中的self參數(shù)
3.1 案例改造 - 給對象增加屬性
在python中,要給對象設(shè)置屬性非常容易,只需要在類的外部的代碼中直接通過點.設(shè)置一個屬性即可,但是不推薦使用,因為對象屬性的封裝應(yīng)該封裝在類的內(nèi)部。
注意:這種方式雖然簡單,但是不推薦使用
代碼演示:
# 可以使用.屬性名 利用賦值語句就可以了
tom.name = "Tom"
black.name = "黑黑"
完整代碼和執(zhí)行結(jié)果如下圖:
3.2 利用self在類封裝的方法中輸出對象屬性
由哪一個對象調(diào)用的方法,方法內(nèi)的self就是哪一個對象的引用。
在類封裝的方法內(nèi)部,self就表示當前調(diào)用方法的對象自己。
在調(diào)用方法時:程序員不需要傳遞self參數(shù)
在方法內(nèi)部: 可以通過self. 訪問對象的屬性,也可以通過self. 調(diào)用其他的對象方法.
利用Debugger工具,在13行代碼前打上斷點,然后點擊F7鍵,控制臺可以看的出來,tom這個變量現(xiàn)在引用了貓對象,貓對象保存的內(nèi)存地址是76A0,如果之前添加了屬性,點擊最左邊的三角可以看到屬性在下面。點擊F7,進入到第一個方法之后,可以看到self同樣是一個貓對象,self的內(nèi)存地址同樣是76A0,self的內(nèi)存地址和tom的內(nèi)存地址完全是一模一樣的。利用這個斷點調(diào)試,可以看出,self就是這個tom變量指向的貓對象,可以得出:哪一個對象調(diào)用的方法,self就是哪一個對象的引用。
再把代碼稍作修改如下圖:通過self. 訪問對象的屬性
可以在利用debugger工具看看執(zhí)行步驟結(jié)果。
更多相關(guān)Python面向?qū)ο笾R點可關(guān)注Python自學網(wǎng): http://www.wakey.com.cn/