从零开始学python项目_从零开始可以这样学python
從零開(kāi)始學(xué)python第二章
面向?qū)ο蟮谝黄?/p>
太原理工大學(xué)機(jī)器人團(tuán)隊(duì)20日打卡day9
? 當(dāng)我們討論python時(shí)不得不討論到面向?qū)ο?#xff0c;而我身為機(jī)器人團(tuán)隊(duì)的一名成員,在平時(shí)設(shè)計(jì)的時(shí)候可以通過(guò)把機(jī)器人的各個(gè)部分設(shè)計(jì)成不同的對(duì)象以此來(lái)簡(jiǎn)化重復(fù)的函數(shù)引用。并且python作為一種面向?qū)ο蟮恼Z(yǔ)言,如果不了解和使用面向?qū)ο?#xff0c;呢么python就是學(xué)習(xí)的不完整的。
1、面向?qū)ο?/p>
2、初始化方法
? 面向?qū)ο蟮幕緝?nèi)容也是十分少和簡(jiǎn)單的,但是并不能說(shuō)這種方法就是簡(jiǎn)單無(wú)意義的。在開(kāi)發(fā)大型項(xiàng)目的時(shí)候,顯然的是這種方法能節(jié)約大量時(shí)間并使代碼簡(jiǎn)單易懂,使編程更像是一種游戲。
1、面向?qū)ο?/p>
面向?qū)ο缶幊?—— Object Oriented Programming 簡(jiǎn)寫(xiě) OOP
目標(biāo)
1.1面向?qū)ο蟮幕靖拍?/p>
我們之前學(xué)習(xí)的編程方式就是 面向過(guò)程 的
面相過(guò)程 和 面相對(duì)象,是兩種不同的 編程方式
對(duì)比 面向過(guò)程 的特點(diǎn),可以更好地了解什么是 面向?qū)ο?/p>
1.2面向過(guò)程和面向?qū)ο蟮幕靖拍?/p>
1)面向過(guò)程——怎么做
把完成某一個(gè)需求的 所有步驟 從頭到尾 逐步實(shí)現(xiàn)
根據(jù)開(kāi)發(fā)需求,將某些 功能獨(dú)立 的代碼 封裝 成一個(gè)又一個(gè) 函數(shù)
最后完成的代碼,就是順序地調(diào)用 不同的函數(shù)
特點(diǎn)
注重 步驟與過(guò)程,不注重職責(zé)分工
如果需求復(fù)雜,代碼會(huì)變得很復(fù)雜
開(kāi)發(fā)復(fù)雜項(xiàng)目,沒(méi)有固定的套路,開(kāi)發(fā)難度很大!
2)面向過(guò)程——誰(shuí)來(lái)做
相比較函數(shù),面向?qū)ο?是 更大 的 封裝,根據(jù) 職責(zé) 在 一個(gè)對(duì)象中 封裝 多個(gè)方法
在完成某一個(gè)需求前,首先確定 職責(zé) —— 要做的事情(方法)
根據(jù) 職責(zé) 確定不同的 對(duì)象,在 對(duì)象 內(nèi)部封裝不同的 方法(多個(gè))
最后完成的代碼,就是順序地讓 不同的對(duì)象 調(diào)用 不同的方法
特點(diǎn)
注重 對(duì)象和職責(zé),不同的對(duì)象承擔(dān)不同的職責(zé)
更加適合應(yīng)對(duì)復(fù)雜的需求變化,是專門(mén)應(yīng)對(duì)復(fù)雜項(xiàng)目開(kāi)發(fā),提供的固定套路
需要在面向過(guò)程基礎(chǔ)上,再學(xué)習(xí)一些面向?qū)ο蟮恼Z(yǔ)法
1.3類(lèi)和對(duì)象
1.31類(lèi)和對(duì)象基本概念
類(lèi) 是對(duì)一群具有 相同 特征 或者 行為 的事物的一個(gè)統(tǒng)稱,是抽象的,不能直接使用
特征被稱為 屬性
行為 被稱為 方法
類(lèi) 就相當(dāng)于制造飛機(jī)時(shí)的圖紙,是一個(gè) 模板,是 負(fù)責(zé)創(chuàng)建對(duì)象的
1.32對(duì)象
對(duì)象是由類(lèi)創(chuàng)建出來(lái)的一個(gè)具體存在,可以直接使用
由 哪一個(gè)類(lèi) 創(chuàng)建出來(lái)的 對(duì)象,就擁有在 哪一個(gè)類(lèi) 中定義的:
屬性
方法
對(duì)象 就相當(dāng)于用 圖紙 制造 的飛機(jī)
1.4類(lèi)和對(duì)象的關(guān)系
類(lèi)是模板,對(duì)象 是根據(jù) 類(lèi) 這個(gè)模板創(chuàng)建出來(lái)的,應(yīng)該 先有類(lèi),再有對(duì)象
類(lèi) 只有一個(gè),而 對(duì)象 可以有很多個(gè)
不同的對(duì)象 之間 屬性 可能會(huì)各不相同
類(lèi) 中定義了什么 屬性和方法,對(duì)象 中就有什么屬性和方法,不可能多,也不可能少
1.5類(lèi)的設(shè)計(jì)
在使用面相對(duì)象開(kāi)發(fā)前,應(yīng)該首先分析需求,確定一下,程序中需要包含哪些類(lèi)!
在程序開(kāi)發(fā)中,要設(shè)計(jì)一個(gè)類(lèi),通常需要滿足一下三個(gè)要素:
類(lèi)名 這類(lèi)事物的名字,滿足大駝峰命名法
屬性 這類(lèi)事物具有什么樣的特征
方法 這類(lèi)事物具有什么樣的行為
大駝峰命名法
每一個(gè)單詞的首字母大寫(xiě)
單詞與單詞之間沒(méi)有下劃線
類(lèi)名的確定
名詞提煉法 分析 整個(gè)業(yè)務(wù)流程,出現(xiàn)的 名詞,通常就是找到的類(lèi)
屬性和方法的確定
對(duì) 對(duì)象的特征描述,通常可以定義成 屬性
對(duì)象具有的行為(動(dòng)詞),通常可以定義成 方法
1.6面向?qū)ο蠡A(chǔ)語(yǔ)法
1.61定義只包含方法的類(lèi)
在 python 中要定義一個(gè)只包含方法的類(lèi),語(yǔ)法格式如下:
class 類(lèi)名:
def 方法1(self, 參數(shù)列表):
pass
def 方法2(self, 參數(shù)列表):
pass
1.62方法中的self函數(shù)
案例改造——給對(duì)象增加屬性
在 Python 中,要 給對(duì)象設(shè)置屬性,非常的容易,但是不推薦使用
因?yàn)?#xff1a;對(duì)象屬性的封裝應(yīng)該封裝在類(lèi)的內(nèi)部
只需要在 類(lèi)的外部的代碼 中直接通過(guò) . 設(shè)置一個(gè)屬性即可
tom.name = "Tom"
...
lazy_cat.name = "大懶貓"
1.63使用self在方法內(nèi)部輸出每一只貓的名字
在類(lèi)封裝的方法內(nèi)部,self.就表示當(dāng)前調(diào)用方法的對(duì)象自己
調(diào)用方法時(shí),程序員不需要傳遞self.參數(shù)
在方法內(nèi)部
可以通過(guò)self.訪問(wèn)對(duì)象的屬性
也可以通過(guò)self.調(diào)用其他的對(duì)象方法
改造代碼如下
class Cat:
def eat(self):
print("%s 愛(ài)吃魚(yú)" % self.name)
tom = Cat()
tom.name = "Tom"
tom.eat()
lazy_cat = Cat()
lazy_cat.name = "大懶貓"
lazy_cat.eat()
在 類(lèi)的外部,通過(guò) 變量名. 訪問(wèn)對(duì)象的 屬性和方法
在 類(lèi)封裝的方法中,通過(guò) self. 訪問(wèn)對(duì)象的 屬性和方法
2、初始化方法
2.1之前代碼存在的問(wèn)題——在類(lèi)的外部給類(lèi)增加屬性
將案例代碼進(jìn)行調(diào)整,先調(diào)用方法 再設(shè)置屬性,觀察一下執(zhí)行效果
tom = Cat()
tom.drink()
tom.eat()
tom.name = "Tom"
print(tom)
程序執(zhí)行報(bào)錯(cuò)如下
AttributeError: 'Cat' object has no attribute 'name'
屬性錯(cuò)誤:'Cat' 對(duì)象沒(méi)有 'name' 屬性
Notes:
在日常開(kāi)發(fā)中,不推薦在 類(lèi)的外部 給對(duì)象增加屬性
如果在運(yùn)行時(shí),沒(méi)有找到屬性,程序會(huì)報(bào)錯(cuò)
對(duì)象應(yīng)該包含有哪些屬性,應(yīng)該 封裝在類(lèi)的內(nèi)部
2.2初始化的方法
當(dāng)使用 類(lèi)名() 創(chuàng)建對(duì)象時(shí),會(huì) 自動(dòng) 執(zhí)行以下操作:
象在內(nèi)存中 分配空間 —— 創(chuàng)建對(duì)象
為對(duì)象的屬性 設(shè)置初始值 —— 初始化方法( init )
這個(gè) 初始化方法 就是 init 方法, init 是對(duì)象的內(nèi)置方法
init 方法是 專門(mén) 用來(lái)定義一個(gè)類(lèi) 具有哪些屬性的方法!
在 Cat 中增加 init 方法,驗(yàn)證該方法在創(chuàng)建對(duì)象時(shí)會(huì)被自動(dòng)調(diào)用
class Cat:
"""這是一個(gè)貓類(lèi)"""
def __init__(self):
print("初始化方法")
2.3在初始化方法內(nèi)部定義屬性
在 init 方法內(nèi)部使用 self.屬性名 = 屬性的初始值 就可以 定義屬性
定義屬性之后,再使用 Cat 類(lèi)創(chuàng)建的對(duì)象,都會(huì)擁有該屬性
class Cat:
def __init__(self):
print("這是一個(gè)初始化方法")
# 定義用 Cat 類(lèi)創(chuàng)建的貓對(duì)象都有一個(gè) name 的屬性
self.name = "Tom"
def eat(self):
print("%s 愛(ài)吃魚(yú)" % self.name)
# 使用類(lèi)名()創(chuàng)建對(duì)象的時(shí)候,會(huì)自動(dòng)調(diào)用初始化方法 __init__
tom = Cat()
tom.eat()
2.4改造初始化方法——初始化的同時(shí)設(shè)置初始值
在開(kāi)發(fā)中,如果希望在 創(chuàng)建對(duì)象的同時(shí),就設(shè)置對(duì)象的屬性,可以對(duì) init 方法進(jìn)行 改造
把希望設(shè)置的屬性值,定義成 init 方法的參數(shù)
在方法內(nèi)部使用 self.屬性 = 形參 接收外部傳遞的參數(shù)
在創(chuàng)建對(duì)象時(shí),使用 類(lèi)名(屬性1, 屬性2…) 調(diào)用
class Cat:
def __init__(self, name):
print("初始化方法 %s" % name)
self.name = name
...
tom = Cat("Tom")
...
lazy_cat = Cat("大懶貓")
總結(jié)
以上是生活随笔為你收集整理的从零开始学python项目_从零开始可以这样学python的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: .net多层结构 sql注入
- 下一篇: 遗传算法Python 教程(1)