首頁/ 娛樂/ 正文

【20天搞定python基礎】跟著賽亞人悟空學習面向物件基礎

【20天搞定python基礎】跟著賽亞人悟空學習面向物件基礎

本文章的思路是:

介紹面向物件概念,世界萬物皆物件

類的定義

類中屬性、方法的新增

物件的建立

屬性和方法的呼叫

物件屬性的新增

方法間呼叫

引言

在介紹面向物件前,我們首先理解下什麼是面向物件。舉一個大家都很熟悉的例子,大象放到冰箱需要幾步?

我們第一想法可能是,大象能放到冰箱嗎?其實這不重要問的是步驟。

【20天搞定python基礎】跟著賽亞人悟空學習面向物件基礎

那這三個步驟跟我們程式設計有關係嗎?有關係!

因為我們所有的程式設計都是按照人的思維方式來實現的。但是上面更加強調的是

步驟

而不是

面向物件

所以是面向過程

面向過程更加註重步驟,如果某個步驟實現遇到問題,程式可能就不能繼續。

在面向物件的世界裡不會首先關注過程、步驟,就是你怎麼放進去的。而是關注物件。

在這個過程中涉及幾個物件,其中

大象和冰箱

就是這個題目中的物件。

大象有很多品種,是所有的大象都是這麼做嗎?題目中說的並不是某一個種類的大象,而是大象這類,所以無論你是什麼大象最後都是關進冰箱。

冰箱也有很多的型號,顏色,大小,品牌 啊等,是指所有的冰箱嗎?當然冰箱指的是所有冰箱的統稱,也是一類——-冰箱類

所以,世界萬物皆物件!!

面向物件的類

類就是一個群體,這個群體是所有的統稱。比如人類,無論你是中國人、美國人、韓國人還是日本人,這些都叫人類。

再比如說:汽車類,指的也是一個群體,勞斯萊斯、賓士、奧迪、寶馬、比亞迪、大眾等等就是車這一類。

朋友們!你們想想生活中還有哪些類呢?

手機類、電腦類、水杯類、植物類、學生類、老師類、水果類、蔬菜類、房子類、醫生類、演員類……

大家發現這些類跟我們生活息息相關,就是將生活中的人與人、人與物的溝通在電腦上體現出來,比如我們常用的購物網站

點開一個購物網站就可以,順著選單點開任意一個類別,比如如果你點選了手機類,所有手機的資訊都出來了。

【20天搞定python基礎】跟著賽亞人悟空學習面向物件基礎

如果讓你定義一個手機類,你會如何實現呢?

我們必須按照這個格式:

class 類名:

屬性

方法

class是關鍵字,類名根據需求自己起名

,比如電腦類就是:Computer,手機類就是:Phone等

重點強調一下格式

注意:

類名的首字母要求大些,不要使用中文。

類名後面是有冒號的

類體像函式體一樣需要縮排的

class Phone:

pass # pass也是關鍵字,表示佔位符。一個完整的類裡面是有東西的,否則結構就“坍塌”即有

這就是一個手機類。但是這個手機類少了些東西。第一手機的特徵要描述出來,其次手機能做什麼也沒有。這不算一個完整的類。

一個完整的類結構是需要有:用來表示特徵的屬性和表示動作的方法。

手機有什麼特徵呢?品牌、顏色、型號、價格、螢幕大小。。。 我們要在類中描述出來。

class Phone:

# 當然屬性也可以不賦值,比如是None或者0,這裡的是類屬性

brand = ‘華為’

color = ‘黑色’

type = ‘Mate30’

price = 3999

但是手機的功能還沒有體現出來,手機能做什麼能打電話、發信息、。。。,所以還要新增方法,方法即動作。方法定義同我們函式的定義,但是也有不同。

【注意方法的引數位置的self】

class Phone:

# 當然屬性也可以不賦值,比如是None或者0

brand = ‘華為’

color = ‘黑色’

type = ‘Mate30’

price = 3999

def call(self):

print(‘可以打電話!’)

def send_message(self):

print(‘可以發信息!’)

好了!一個類的完整結構就完成了。我們再來定義一個類,比如賽亞人類:

class Saiya:

name = ‘悟空’

hair = ‘固定’

has_tail = True

appetite = ‘大’

def fight(self):

print(‘我們賽亞人就是喜歡戰爭!’)

但是類定義了怎麼用呢?

前面我們提到過,

類是一個統稱

如果買手機你肯定不會說:我買手機,肯定是買手機類中的某一個手機。而這一個手機我們就稱作物件。

物件是具體的,類是抽象的。

這個類就好比一個模具,造月餅的模具,透過這個模具可以造出很多的月餅,而我們吃到的月餅就是物件。

【20天搞定python基礎】跟著賽亞人悟空學習面向物件基礎

物件的建立

建立物件的方式:

物件名 = 類名([引數,。。。])

故:

# 建立手機物件

phone1 = Phone()

phone2 = Phone()

phone3 = Phone()

# 三個不同的記憶體地址,所以建立一個物件就有一塊自己的記憶體地址

print(phone1)

print(phone2)

print(phone3)

如何檢視物件的屬性和呼叫物件的動作呢?

透過

物件名加點訪問

,這樣的格式。

物件名。屬性名

或者

物件名。方法名()

比如上面的手機物件呼叫

# 獲取屬性值

print(phone1。brand)

print(phone1。price)

#呼叫方法

phone1。call()

phone1。send_message(

再建立Saiya類物件,並呼叫一下方法

s1 = Saiya()

s2 = Saiya()

s3 = Saiya()

print(s1)

print(s2)

print(s3)

print(s1。has_tail)

s1。fight()

s2。fight()

# 觀察

print(s1。name)

print(s2。name)

print(s3。name)

怎麼打印出來的name都一樣呢?

【20天搞定python基礎】跟著賽亞人悟空學習面向物件基礎

物件屬性新增

如果不希望他們訪問類的屬性,物件新增屬性的方式有兩種:

物件動態新增

在建立物件的時候,__init__新增

第一種新增方式:

所謂物件動態新增就是在建立完物件之後,透過【物件。屬性名=新值】的方式賦值。

比如:手機類、賽亞人類(在原來程式碼基礎上講就行)

類的定義省略。。。。。使用原來的程式碼

# 建立手機物件

phone1 = Phone()

phone2 = Phone()

phone3 = Phone()

# 給phone1新增brand品牌,如果不設定獲取的就是類中屬性設定的品牌:華為

print(phone1。brand) # 先列印一下,然後修改,然後列印觀察變化

phone1。brand= ‘oppo’

phone1。price = 4999

print(phone1。brand)

# 同理是phone2,phone3也可以改變

同理賽亞人類也是如此

類的定義省略。。。。。使用原來的程式碼

s1 = Saiya()

s2 = Saiya()

s3 = Saiya()

# 改變s1的名字,可以互動一下,你們知道的龍珠中,是賽亞人的還有誰呢?

s1。name=‘貝吉塔’

print(s1。name)

s2。name = ‘巴達克’

print(s2。name)

第二種新增方式

利用魔術方法完成,最常用的用於實現屬性初始化的方法是;__init__

所謂魔術方法就是無需呼叫,在某種場景下會自動觸發的方法。其中 __init__就是,看一下他的使用

重新定義一個類比如我們熟悉的人類,

# 先不新增屬性,看一下__init__的使用

class Person:

country = ‘中國’

# 定義__init__方法

def __init__(self):

print(‘我是一個__init__方法’)

def eat(self):

print(‘我是吃貨,每天各種美食吃吃喝喝真美!’)

# 建立物件

p1 = Person() # 觀察結果 可以看到有內容打印出來

p2 = Person() # 觀察結果

print(p1)

print(p2)

可以看到建立物件就預設呼叫__init__,並沒有顯示的呼叫__init__。

在__init__中新增屬性,

此處注意講解self的作用,self表示物件自身,如何體現出來?在init中列印一下self物件觀察是否是與原物件地址一致

強調如果init有引數在建立物件的時候必須加引數

class Person:

country = ‘中國’

# 定義__init__方法

def __init__(self,name):

print(‘我是一個__init__方法’)

print(self)

self。name=name # 此時就相當於在self這個空間中存放了一個name屬性

def eat(self):

print(‘我是吃貨,每天各種美食吃吃喝喝真美!’)

p = Person() # 此時報錯,沒有引數 註釋掉

p = Person(‘龜仙人’)

print(p。name)

p1 = Person(‘布林瑪’)

print(p1。name)

# 大家可以看到物件呼叫name,名字不一樣了

# 此處列印的結果也是一樣的???????為什麼???呼叫的都是eat方法,如果加以區分如何實現?

p。eat()

p1。eat()

可以在eat中飲用name屬性,比如(修改Person的eat方法)

class Person:

country = ‘中國’

# 定義__init__方法

def __init__(self,name):

print(‘我是一個__init__方法’)

print(self)

self。name=name

# 此處再次強調self,self表示物件,誰呼叫eat此時的self就是誰

def eat(self):

print(self。name + ‘是吃貨,每天各種美食吃吃喝喝真美!’)

p = Person(‘龜仙人’)

p1 = Person(‘布林瑪’)

p。eat()

p1。eat()

此時列印的結果就不一樣了。

如果再加一個方法呢?在這個方法中我們介紹下帶引數的方法定義

class Person:

country = ‘中國’

# 定義__init__方法

def __init__(self,name):

print(‘我是一個__init__方法’)

print(self)

self。name=name

# 此處再次強調self,self表示物件,誰呼叫eat此時的self就是誰

def eat(self):

print(self。name + ‘是吃貨,每天各種美食吃吃喝喝真美!’)

# 當然方法中也可以有更多的語句

def sport(self,time):

if time<6:

print(self。name+‘你太勤快了,起這麼早去練功了啦!贊’)

else:

print(‘怎麼這麼愛偷懶呢?還不抓緊時間練功去!哼!’)

p = Person(‘悟空’)

p。eat()

p。sport(4)

p = Person(‘雅木茶’)

p。sport(9)

也可以在sport中呼叫eat的,即

def sport(self,time):

if time<6:

print(self。name+‘你太勤快了,起這麼早去練功了啦!贊’)

else:

print(‘怎麼這麼愛偷懶呢?還不抓緊時間練功去!哼!’)

# 比如練完功了,吃飯去,注意使用eat

self。eat()

最後總結:

面向物件類與物件的使用步驟:

提取特徵、動作,定義類

在類中定義__init__方法初始化屬性

在類中定義方法

根據類,建立物件

物件呼叫屬性或者方法

相關文章

頂部