Python「面向?qū)ο蠡菊Z法2」引用概念、方法中的self參數(shù)

一、強調(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é)果:


圖片1.png

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é)果:

圖片2.png

問題1答案:tom和black是同一個對象,因為從執(zhí)行結(jié)果可以看出對象的地址是一樣的

問題2答案:black_2和black是同一個對象同一個貓,因為從執(zhí)行結(jié)果可以看出對象的地址是一樣的

圖片3.png

在第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é)果如下圖:

圖片4.png

3.2 利用self在類封裝的方法中輸出對象屬性

由哪一個對象調(diào)用的方法,方法內(nèi)的self就是哪一個對象的引用。

在類封裝的方法內(nèi)部,self就表示當前調(diào)用方法的對象自己。

在調(diào)用方法時:程序員不需要傳遞self參數(shù)

在方法內(nèi)部: 可以通過self. 訪問對象的屬性,也可以通過self. 調(diào)用其他的對象方法.

圖片5.png
圖片6.png

利用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é)果。


圖片7.png

更多相關(guān)Python面向?qū)ο笾R點可關(guān)注Python自學網(wǎng)http://www.wakey.com.cn/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容