天天看點

python采用面向對象程式設計模式嗎_python基礎之面向對象程式設計

面向對象程式設計思想

python采用面向對象程式設計模式嗎_python基礎之面向對象程式設計

面向對象是一門程式設計思想,程式設計思想僅僅是一門思想,與任何技術無關

核心是對象兩字,對象可以了解為特征與技能的結合體

基于該程式設計思想編寫程式,就好比創造世界,一種造物主的思維方式

優點:可擴張性強

缺點:編寫程式的複雜難度比面向過程高

以上都是純理論,了解下用自己的話能編出來就行,下面來說說核心對象

在現實世界中,通過一個個的對象,根據相同的特征和行為,再分門别類。

但是在程式中,必須先有類,再通過調用類,建立對象。

那麼,咱們如何定義類,又如何建立對象呢?(暫時還是先說理論吧,不然看代碼,估計直接懵逼了……)

關于類的緻命三問:什麼是類?有什麼用?怎麼使用?

類的定義:就是類型、類别,跟現實的分類類似。是一系列對象之間相同特征和行為(技能)的結合體

類的作用:個人了解,就是為了建立對象用的。

(終于要寫代碼了,哈哈哈哈哈哈哈)

類的文法:

class 類名:

特征 # 在python 中,用變量來表示特征

行為 # 在python 中,用函數來表示行為,也就是大家所說的技能

現在,我們來寫一個人類,人類的特征有名字,年齡,性别,行為有吃飯,跑步,玩,撸代碼了!

"""

人類

特征:名字、年齡、性别

行為:吃飯、跑、玩

"""

class person:

# 這些都是人的特征

name = "dawn" # 姓名

age = 27 # 年齡

sex = "男" # 性别

# 這些都是人的行為(技能)

def eat(self):

# 吃飯

print("民以食為天o(∩_∩)o 哈哈")

def run(self):

# 跑步

print("英雄救美,不存在的!别慫!趕緊跑!!!")

def play(self):

# 玩

print("大爺!歡迎下次來玩兒啊!")

print(person)

print(person.name)

print(person.play)

輸出結果

# person 的列印結果

dawn # person.name 的列印結果

# person.play 的列印結果

瞅了這麼久,發現了嗎?類名,類的行為,類的屬性都是咋用的?(理論又來了~~~)

類名的命名規範:使用駝峰命名法,即單詞的首字母得大寫!

類提供了一種便捷的擷取名字的方式,就是類名.名字。類的名字包含特征和行為。咱們将類的特征稱之為屬性,類的行為稱之為方法

在類的内部定義函數(也就是行為的時候,預設有一個參數self),這個是幹啥的,等會說

通過輸出的内容來看,類名指向的是類的記憶體位址。如何來檢視類的名稱空間呢?看代碼……

print(person.__dict__)

輸出結果

{'__module__': '__main__', 'name': 'dawn', 'age': 27, 'sex': '男', 'eat': , 'run': , 'play': , '__dict__': , '__weakref__': , '__doc__': none}

驚不驚喜!意不意外!對,這就是person類的名稱空間中的内容!!!也就是說類的名稱空間是在定義階段産生

到這裡,咱們就該聊聊類是如何使用的了。前面咱就說了,類的調用就是對象的建立。說的類的使用就得知道對象是啥了!耐心點,好玩的還在後面!

哈哈哈哈哈!我三連問回來啦!——什麼是對象?有什麼用?怎麼使用?

對象的定義:特征與技能的結合體

文法:類名()

咱們來瞅瞅對象是如何建立的,類又是如何調用的 !

# 上面咱定義了一個person類,這裡直接拿來用

# 調用person類後會産生一個對象,使用一個變量接收

p1 = person()

# 輸出p1 的屬性

print(p1.name, p1.age, p1.sex)

# 使用p1 的方法

p1.play()

p1.run()

p1.eat()

輸出結果

dawn 27 男 # p1的屬性

大爺!歡迎下次來玩兒啊! # p1.play()的結果

英雄救美,不存在的!别慫!趕緊跑!!! # p1.run()的結果

民以食為天o(∩_∩)o 哈哈 # p1.eat()的結果

剛剛擷取了對象的屬性(也就是查詢),發現沒有,這些屬性都是類的,我們能否對對象的屬性做個增删改呢?如果修改了對象的屬性,類是否随之改變呢?動手試試

修改對象的屬性,其實就是對象自己增加了屬性

# 修改屬性

print(person.__dict__) # 修改前,person的名稱空間

print(p1.__dict__) # 修改前,p1的名稱空間

p1.name = "haha" # 修改對象的name 屬性,實際上是p1對象自己新增了name 屬性

print(person.__dict__) # 修改後,person的名稱空間

print(p1.__dict__) # 修改後,p1的名稱空間

輸出結果

python采用面向對象程式設計模式嗎_python基礎之面向對象程式設計

增加對象的屬性

# 增加屬性

print(p1.__dict__)

print(person.__dict__)

p1.hobby = "read"

print(p1.__dict__)

print(person.__dict__)

輸出結果

python采用面向對象程式設計模式嗎_python基礎之面向對象程式設計

删除對象的屬性

# 删除屬性

del p1.sex

print(p1.sex)

print(person.__dict__)

輸出結果

python采用面向對象程式設計模式嗎_python基礎之面向對象程式設計

縱觀以上的結果,咱說了那些屬性都在類的名稱空間裡,那麼有沒有什麼方法,讓這些屬性是通過對象來增删改查的呢?

當然有的啦!那就是__init__()!我們來看看使用方式

# 定義一個類

class person:

# 這些都是人的特征

name = "dawn" # 姓名

# __init__()

def __init__(self, name, age, sex):

self.name = name

self.age = age

self.sex = sex

# 這些都是人的行為(技能)

def eat(self):

# 吃飯

print("民以食為天o(∩_∩)o 哈哈")

# 通過類建立兩個對象,分别是p1和p2

p1 = person("haha", 39, "男")

p2 = person("lee", 21, "女")

# 檢視person類的名稱空間

print(person.__dict__)

# 檢視對象p1的名稱空間

print(p1.__dict__)

# 檢視對象p2的名稱空間

print(p2.__dict__)

輸出結果

python采用面向對象程式設計模式嗎_python基礎之面向對象程式設計

發現什麼了沒有?

__init__()實作了對象的個性化定制,而且建立對象在傳參時,沒有傳self這個參數。

那是因為__init__()在調用時,會将對象本身作為第一個參數傳入。原因後期學習以後,才知道。現在就做一個總結好了

由對象來調用類的内部函數,稱為對象的綁定方法。對象的綁定方法特殊之處在于:會将對象本身當作第一個參數傳入方法(咱可以回頭看看定義類的時候,是不是每個行為也就是方法,都有self參數)

__init__() 在調用類時觸發,會做以下事情:

将對象本身當作第一個參數傳入方法(原因:對象的綁定方法)

調用時,傳入的其他參數一并被 __init__() 接收

接着,我們來看看,對象是如何對屬性做增删改查的

# 擷取p1的屬性

print(f"姓名:{p1.name},性别:{p1.sex},年齡:{p1.age}")

# 修改p1的屬性

print(f"修改前,p1的名稱空間:{p1.__dict__}")

p1.age = 27

print(f"修改後,p1的屬性值:{p1.age}")

print(f"修改後,p1的名稱空間:{p1.__dict__}")

輸出結果

python采用面向對象程式設計模式嗎_python基礎之面向對象程式設計

再來看看增加(前面就已經舉例了,算了還是再舉一個吧)和删除

# 擷取p1的屬性

print(f"姓名:{p1.name},性别:{p1.sex},年齡:{p1.age}")

# 增加屬性

print(f"增加hobby前:{p1.__dict__}")

p1.hobby = "read"

print(f"hobby的取值:{p1.hobby}")

print(f"增加hobby後:{p1.__dict__}")

# 删除屬性

print(f"删除sex前:{p1.__dict__}")

del p1.sex

print(f"删除sex後:{p1.__dict__}")

輸入結果

python采用面向對象程式設計模式嗎_python基礎之面向對象程式設計

還有個地方,就是咱剛才一直在說名稱空間,那麼類的名稱空間和對象的名稱空間,有什麼關系呢?

咱們繼續看代碼

# 通過類建立一個對象

p1 = person("haha", 39, "男")

# 檢視person類的名稱空間和屬性

print(f"person的名稱空間:{person.__dict__}")

print(f"person的name屬性值:{person.name}")

# 檢視對象p1的名稱空間和屬性

print(f"p1的名稱空間:{p1.__dict__}")

print(f"p1的name屬性值:{p1.name}")

# 删除p1的屬性name,再列印p1的名稱空間和屬性

del p1.name

print(f"删除name屬性後,p1的名稱空間:{p1.__dict__}")

print(f"删除name屬性後,p1的name屬性值:{p1.name}")

輸出結果

python采用面向對象程式設計模式嗎_python基礎之面向對象程式設計

看到沒?對象的屬性删除後,再去調用這個屬性,并沒有報錯,而是将類中的同名屬性值擷取了過來

那如果類中沒有這個屬性呢?我們再來看看

class person:

# 這些都是人的特征

def __init__(self, name, age, sex):

self.name = name

self.age = age

self.sex = sex

# 通過類建立一個對象

p1 = person("haha", 39, "男")

# 檢視對象p1的名稱空間和屬性

print(f"p1的名稱空間:{p1.__dict__}")

print(f"p1的name屬性值:{p1.name}")

# 删除p1的屬性name,再列印p1的名稱空間和屬性

del p1.name

print(f"删除name屬性後,p1的名稱空間:{p1.__dict__}")

print(f"删除name屬性後,p1的name屬性值:{p1.name}")

輸出結果

python采用面向對象程式設計模式嗎_python基礎之面向對象程式設計

報錯了!!!由此我們可以總結下:

對象先從自身名稱空間查找,沒有就去類的名稱空間查找,再沒有就會報錯。

對象名字的查找順序:

對象自身 ----→ 類 ----→ 都沒有,報錯

定義類及調用的固定模式

class 類名:

def __init__(self,參數1,參數2):

self.對象的屬性1 = 參數1

self.對象的屬性2 = 參數2

def 方法名(self):pass

def 方法名2(self):pass

對象名 = 類名(1,2) #對象就是執行個體,代表一個具體的東西

#類名() : 類名+括号就是執行個體化一個類,相當于調用了__init__方法

#括号裡傳參數,參數不需要傳self,其他與init中的形參一一對應

#結果傳回一個對象

對象名.對象的屬性1 #檢視對象的屬性,直接用 對象名.屬性名 即可

對象名.方法名() #調用類中的方法,直接用 對象名.方法名() 即可

希望與廣大網友互動??

點此進行留言吧!