python之物件導向的程式設計

來源:互聯網
上載者:User

標籤:文檔   eth   指令   調試   blog   背景   apache   地址   bin   

第一:程式設計思想與發展曆程(瞭解)

1940年以前:面向機器編程
最早的是採用機器語言編程,也就是直接使用二進位碼來表示機器能夠識別的指令和資料。
優點:機器語言由機器直接執行,速度快
缺點:寫起來非常困難,並且不容易修改

組合語言:用助記符號代替機器指令的作業碼,用地址符號或者標號代替指令或運算元的地址
優點:比機器語言的二進位碼編寫方便些
缺點:組合語言本質上還是一種面向機器的語言,編寫困難,易出錯

脫離機器後:面向過程編程
面向過程的結構化程式設計強調功能的抽象和程式的模組化, 它將解決問題的過程看作是一個處理過程,如c語言
優點:對底層的硬體,記憶體,cpu等操作比較方便
缺點:不易擴充,寫代碼,調試比較麻煩

第一次軟體危機:結構化程式設計
採取“自頂向下、逐步細化、模組化”的指導思想。結構化程式設計本質上還是一種面向過程的設計思想,但通過“自頂向下、逐步細化、模組化”的方法,將軟 件的複雜度控制在一定範圍內,從而從整體上降低了軟體開發的複雜度
1960年爆發,背景:由於軟體品質低下,項目無法如期完成、項目嚴重超支,因為軟體而導致的重大事故經常發生,主要體現在複雜性上
1968年第一個結構化程式語言Pascal誕生
1970年成為軟體開發的主流

第二次軟體危機:物件導向程式設計
根本原因:軟體生產力遠遠跟不上硬體和業務的發展。
主要體現在‘可擴充性’與‘可維護性’上
早在1967年的Simula語言就提出物件導向,第二次危機促進了物件導向的發展
1980s年代,得益於C++,以及後來java,C#把物件導向推向了高峰,現在已經成為主流開發思想

第二:什麼是物件導向程式設計

首先在這說一下什麼是面向過程設計

面向過程的程式設計的核心是過程,過程即解決問題的步驟。面向過程可理解成一條流水線

優點是:極大的降低了程式的複雜度

缺點是:一套流水線或者流程就是用來解決一個問題,如果是生產麵包的流水線不可能生產包子,即便是能,也得是大改,改一個組件,牽一髮而動全身。

應用情境:一旦完成基本很少改變的情境,著名的例子有Linux內核,git,以及Apache HTTP Server等。

物件導向設計:

物件導向的程式設計的核心是對象,對象可理解成特徵,屬性等

優點是:解決了程式的擴充性。對某一個對象單獨修改,會立刻反映到整個體系中,如對遊戲中一個人物參數的特徵和技能修改都很容易。

缺點:可控性差,無法向面向過程的程式設計流水線式的可以很精準的預測問題的處理流程與結果,物件導向的程式一旦開始就由對象之間的互動解決問題,即便是神也無法預測最終結果。

應用情境:需求經常變化的軟體,一般需求的變化都集中在使用者層,互連網應用,企業內部軟體,遊戲等都是物件導向的程式設計大顯身手的好地方

第三:類和對象

物件導向最重要的概念就是類(Class)和執行個體(Instance),必須牢記類是抽象的模板,而執行個體是根據類建立出來的一個個具體的“對象”,每個對象都擁有相同的方法,但各自的資料可能不同。

類:資料與函數的結合,二者稱為類的屬性

類:

類的定義:

class Garen:    #定義英雄蓋倫的類,不同的玩家可以用它執行個體出自己英雄;    camp=‘Demacia‘  #所有玩家的英雄(蓋倫)的陣營都是Demacia;    def __init__(self,nickname,aggresivity,life_value): #蓋倫英雄的名字,攻擊力,生命值        self.nickname=nickname  #別名        self.aggrv=aggresivity       #攻擊力        self.life_value=life_value   #生命值

類的兩種作用:執行個體化和屬性引用

#!/usr/bin/env python#-*-coding:utf-8-*-class Garen:    camp=‘Demacia‘    def __init__(self,nickname,aggresivity,life_value):        self.nickname=nickname        self.aggrv=aggresivity        self.life_value=life_value    def attack(self,enemy): #攻擊技能,enemy是敵人        print(‘is attacking‘,self,enemy)#類的功能一:執行個體化(__init__與self)
類名加括弧就是執行個體化,會自動觸發__init__函數的運行,可以用它來為每個執行個體定製自己的特徵
g1=Garen(‘草叢倫‘,80,120) #Garen.__init__(g1,‘草叢倫‘,80,120) #g1=self,nickname=‘草叢倫‘,aggresivity=80,life_value=120
#執行個體調用
g1.attack(3) #Garen.attack(g1,‘a‘)
#輸出結果:
#is attacking <__main__.Garen object at 0x0000000002679C50> 3

#類功能二:屬性引用(類名.屬性),包括資料屬性和函數屬性#資料屬性:print(Garen.camp)#輸出結果:Demacia##函數屬性:print(Garen.__init__)print(Garen.attack)#輸出結果:#<function Garen.__init__ at 0x000000000252B840>#<function Garen.attack at 0x000000000252B8C8>

 類的屬性的補充:

一:我們定義的類的屬性到底存到哪裡了?有兩種方式查看dir(類名):查出的是一個名字列表類名.__dict__:查出的是一個字典,key為屬性名稱,value為屬性值二:特殊的類屬性類名.__name__# 類的名字(字串)類名.__doc__# 類的文檔字串類名.__base__# 類的第一個父類(在講繼承時會講)類名.__bases__# 類所有父類構成的元組(在講繼承時會講)類名.__dict__# 類的字典屬性類名.__module__# 類定義所在的模組類名.__class__# 執行個體對應的類(僅新式類中)
對象:

單獨說一下對象,藉助上一個例子

g1=Garen(‘草叢倫‘) #類執行個體化得到g1這個執行個體,基於該執行個體看下對象

執行個體/對象只有一個屬性:

#對於一個執行個體來說,只有一個功能:屬性引用,執行個體本身只擁有資料屬性print(g1.nickname)print(g1.aggrv)print(g1.life_value)輸出結果:草叢倫80120

對象補充:

查看執行個體屬性同樣是dir和內建__dict__兩種方式特殊執行個體屬性__class____dict__

對象/執行個體本身只有資料屬性,但是python的class機制會將類的函數綁定到對象上,稱為對象的方法,或者叫Binder 方法

#執行個體可以調用類的資料屬性和函數屬性print(g1.camp)       print(g1.attack)    #對象的Binder 方法
#輸出結果:
# Demacia
# <bound method Garen.attack of <__main__.Garen object at 0x0000000002269CC0>>
#類的調用: 相當於函數Garen.attack(1,2)# 輸出結果:# is attacking 1 2
對象之間的互動:
class Garen:    camp=‘Demacia‘    def __init__(self,nickname,aggresivity,life_value):        self.nickname=nickname        self.aggrv=aggresivity        self.life_value=life_value    def attack(self,enemy):        print(‘is attacking‘,self,enemy)class Riven:    camp=‘Noxus‘    def __init__(self,nickname,aggresivity,life_value):        self.nickname=nickname        self.aggrv=aggresivity        self.life_value=life_value    def attack(self,enemy):        print(‘is attacking‘,self,enemy)        enemy.life_value-=self.aggrv   #g1.life_value-=r1.aggrv 根據蓋倫的攻擊力幹掉瑞文的生命值g1=Garen(‘草叢倫‘,80,100)r1=Riven(‘瑞文‘,60,200)print(g1.life_value)r1.attack(g1)print(g1.life_value)輸出結果:100is attacking <__main__.Riven object at 0x00000000021A9E10> <__main__.Garen object at 0x00000000021A9DD8>40

類的名稱空間:

建立一個類就會建立一個類的名稱空間,用來儲存類中定義的所有名字,這些名字稱為類的屬性

類有兩種屬性:資料屬性和函數屬性

 

其中類的資料屬性是共用給所有對象的

print(id(g1.camp))print(id(Garen.camp))輸出結果:3457544834575448

而類的函數屬性是綁定到所有對象的:

print(id(g1.attack))print(id(Garen.attack))輸出結果:3183904840155336

  總結:建立一個對象/執行個體就會建立一個對象/執行個體的名稱空間,存放對象/執行個體的名字,稱為對象/執行個體的屬性

           在Garen裡面找camp,會先從__init__中找,camp,如果沒有會在類中去找,如果還沒有的話,就到父類中去找,一直把所有的父類都找完,還沒有的話,就會拋出異常。 

第四:繼承與派生

python之物件導向的程式設計

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.