編程是 程序 員 用特定的語法+數據結構+算法組成的代碼來告訴計算機如何執行任務的過程 , 一個程序是程序員爲了獲得一個任務結果而編寫的一組指令的集合,正所謂條條大路通羅馬,實現一個任務的方式有不少種不一樣的方式, 對這些不一樣的編程方式的特色進行概括總結得出來的編程方式類別,即爲編程範式。 不一樣的編程範式本質上表明對各類類型的任務採起的不一樣的解決問題的思路, 大多數語言只支持一種編程範式,固然也有些語言能夠同時支持多種編程範式。 兩種最重要的編程範式分別是面向過程編程和麪向對象編程。html
面向過程編程(Procedural Programming)
Procedural programming uses a list of instructions to tell the computer what to do step-by-step.
面向過程編程依賴 - 你猜到了- procedures,一個procedure包含一組要被進行計算的步驟, 面向過程又被稱爲top-down languages, 就是程序從上到下一步步執行,一步步從上到下,從頭至尾的解決問題 。基本設計思路就是程序一開始是要着手解決一個大的問題,而後把一個大問題分解成不少個小問題或子過程,這些子過程再執行的過程再繼續分解直到小問題足夠簡單到能夠在一個小步驟範圍內解決。python
這樣作的問題也是顯而易見的,就是若是你要對程序進行修改,對你修改的那部分有依賴的各個部分你都也要跟着修改, 舉個例子,若是程序開頭你設置了一個變量值 爲1 , 但若是其它子過程依賴這個值 爲1的變量才能正常運行,那若是你改了這個變量,那這個子過程你也要修改,假如又有一個其它子程序依賴這個子過程 , 那就會發生一連串的影響,隨着程序愈來愈大, 這種編程方式的維護難度會愈來愈高。
因此咱們通常認爲, 若是你只是寫一些簡單的腳本,去作一些一次性任務,用面向過程的方式是極好的,但若是你要處理的任務是複雜的,且須要不斷迭代和維護 的, 那仍是用面向對象最方便了。程序員
OOP編程是利用「類」和「對象」來建立各類模型來實現對真實世界的描述,使用面向對象編程的緣由一方面是由於它可使程序的維護和擴展變得更簡單,而且能夠大大提升程序開發效率 ,另外,基於面向對象的程序可使它人更加容易理解你的代碼邏輯,從而使團隊開發變得更從容。算法
面向對象的幾個核心特性以下編程
Class 類
一個類便是對一類擁有相同屬性的對象的抽象、藍圖、原型。在類中定義了這些對象的都具有的屬性(variables(data))、共同的方法數據結構
Object 對象
一個對象便是一個類的實例化後實例,一個類必須通過實例化後方可在程序中調用,一個類能夠實例化多個對象,每一個對象亦能夠有不一樣的屬性,就像人類是指全部人,每一個人是指具體的對象,人與人以前有共性,亦有不一樣編程語言
Encapsulation 封裝
在類中對數據的賦值、內部調用對外部用戶是透明的,這使類變成了一個膠囊或容器,裏面包含着類的數據和方法模塊化
Inheritance 繼承
一個類能夠派生出子類,在這個父類裏定義的屬性、方法自動被子類繼承函數式編程
Polymorphism 多態
態是面向對象的重要特性,簡單點說:「一個接口,多種實現」,指一個基類中派生出了不一樣的子類,且每一個子類在繼承了一樣的方法名的同時又對父類的方法作了不一樣的實現,這就是同一種事物表現出的多種形態。
編程其實就是一個將具體世界進行抽象化的過程,多態就是抽象化的一種體現,把一系列具體事物的共同點抽象出來, 再經過這個抽象的事物, 與不一樣的具體事物進行對話。
對不一樣類的對象發出相同的消息將會有不一樣的行爲。好比,你的老闆讓全部員工在九點鐘開始工做, 他只要在九點鐘的時候說:「開始工做」便可,而不須要對銷售人員說:「開始銷售工做」,對技術人員說:「開始技術工做」, 由於「員工」是一個抽象的事物, 只要是員工就能夠開始工做,他知道這一點就好了。至於每一個員工,固然會各司其職,作各自的工做。
多態容許將子類的對象看成父類的對象使用,某父類型的引用指向其子類型的對象,調用的方法是該子類型的方法。這裏引用和調用方法的代碼編譯前就已經決定了,而引用所指向的對象能夠在運行期間動態綁定函數
1
2
3
4
5
6
7
8
9
10
11
|
#role 1
name
=
'Alex'
role
=
'terrorist'
weapon
=
'AK47'
life_value
=
100
#rolw 2
name2
=
'Jack'
role2
=
'police'
weapon2
=
'B22'
life_value2
=
100
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#role 1
name
=
'Alex'
role
=
'terrorist'
weapon
=
'AK47'
life_value
=
100
money
=
10000
#rolw 2
name2
=
'Jack'
role2
=
'police'
weapon2
=
'B22'
life_value2
=
100
money2
=
10000
#role 3
name3
=
'Rain'
role3
=
'terrorist'
weapon3
=
'C33'
life_value3
=
100
money3
=
10000
#rolw 4
name4
=
'Eric'
role4
=
'police'
weapon4
=
'B51'
life_value4
=
100
money4
=
10000
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
roles
=
{
1
:{
'name'
:
'Alex'
,
'role'
:
'terrorist'
,
'weapon'
:
'AK47'
,
'life_value'
:
100
,
'money'
:
15000
,
},
2
:{
'name'
:
'Jack'
,
'role'
:
'police'
,
'weapon'
:
'B22'
,
'life_value'
:
100
,
'money'
:
15000
,
},
3
:{
'name'
:
'Rain'
,
'role'
:
'terrorist'
,
'weapon'
:
'C33'
,
'life_value'
:
100
,
'money'
:
15000
,
},
4
:{
'name'
:
'Eirc'
,
'role'
:
'police'
,
'weapon'
:
'B51'
,
'life_value'
:
100
,
'money'
:
15000
,
},
}
print
(roles[
1
])
#Alex
print
(roles[
2
])
#Jack
|
1
2
3
4
5
6
7
8
9
10
11
|
def
shot(by_who):
#開了槍後要減子彈數
pass
def
got_shot(who):
#中槍後要減血
who[‘life_value’]
-
=
10
pass
def
buy_gun(who,gun_name):
#檢查錢夠不夠,買了槍後要扣錢
pass
...
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class
Role(
object
):
def
__init__(
self
,name,role,weapon,life_value
=
100
,money
=
15000
):
self
.name
=
name
self
.role
=
role
self
.weapon
=
weapon
self
.life_value
=
life_value
self
.money
=
money
def
shot(
self
):
print
(
"shooting..."
)
def
got_shot(
self
):
print
(
"ah...,I got shot..."
)
def
buy_gun(
self
,gun_name):
print
(
"just bought %s"
%
gun_name)
r1
=
Role(
'Alex'
,
'police'
,'AK47’)
#生成一個角色
r2
=
Role(
'Jack'
,
'terrorist'
,'B22’)
#生成一個角色
|
1
2
3
4
5
6
7
|
class
Role(
object
):
#定義一個類, class是定義類的語法,Role是類名,(object)是新式類的寫法,必須這樣寫,之後再講爲何
def
__init__(
self
,name,role,weapon,life_value
=
100
,money
=
15000
):
#初始化函數,在生成一個角色時要初始化的一些屬性就填寫在這裏
self
.name
=
name
#__init__中的第一個參數self,和這裏的self都 是什麼意思? 看下面解釋
self
.role
=
role
self
.weapon
=
weapon
self
.life_value
=
life_value
self
.money
=
money
|
1
2
|
r1
=
Role(
'Alex'
,
'police'
,'AK47’)
#生成一個角色 , 會自動把參數傳給Role下面的__init__(...)方法
r2
=
Role(
'Jack'
,
'terrorist'
,'B22’)
#生成一個角色
|
咱們看到,上面的建立角色時,咱們並無給__init__傳值,程序也沒未報錯,是由於,類在調用它本身的__init__(…)時本身幫你給self參數賦值了,
1
2
|
r1
=
Role(
'Alex'
,
'police'
,
'AK47’) #此時self 至關於 r1 , Role(r1,'
Alex
','
police
','
AK47’)
r2
=
Role(
'Jack'
,
'terrorist'
,
'B22’)#此時self 至關於 r2, Role(r2,'
Jack
','
terrorist
','
B22’)
|
1
2
|
def
buy_gun(
self
,gun_name):
print
(「
%
s has just bought
%
s」
%
(
self
.name,gun_name) )
|
1
2
|
r1
=
Role(
'Alex'
,
'police'
,
'AK47'
)
r1.buy_gun(
"B21」) #python 會自動幫你轉成 Role.buy_gun(r1,」B21"
)
|
封裝最好理解了。封裝是面向對象的特徵之一,是對象和類概念的主要特性。
封裝,也就是把客觀事物封裝成抽象的類,而且類能夠把本身的數據和方法只讓可信的類或者對象操做,對不可信的進行信息隱藏。
面向對象編程 (OOP) 語言的一個主要功能就是「繼承」。繼承是指這樣一種能力:它可使用現有類的全部功能,並在無需從新編寫原來的類的狀況下對這些功能進行擴展。
經過繼承建立的新類稱爲「子類」或「派生類」。
被繼承的類稱爲「基類」、「父類」或「超類」。
繼承的過程,就是從通常到特殊的過程。
要實現繼承,能夠經過「繼承」(Inheritance)和「組合」(Composition)來實現。
在某些 OOP 語言中,一個子類能夠繼承多個基類。可是通常狀況下,一個子類只能有一個基類,要實現多重繼承,能夠經過多級繼承來實現。
繼承概念的實現方式有三類:實現繼承、接口繼承和可視繼承。
在考慮使用繼承時,有一點須要注意,那就是兩個類之間的關係應該是「屬於」關係。例如,Employee 是一我的,Manager 也是一我的,所以這兩個類均可以繼承 Person 類。可是 Leg 類卻不能繼承 Person 類,由於腿並非一我的。
OO開發範式大體爲:劃分對象→抽象類→將類組織成爲層次化結構(繼承和合成) →用類與實例進行設計和實現幾個階段。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class
Animal:
def
__init__(
self
, name):
# Constructor of the class
self
.name
=
name
def
talk(
self
):
# Abstract method, defined by convention only
raise
NotImplementedError(
"Subclass must implement abstract method"
)
class
Cat(Animal):
def
talk(
self
):
return
'Meow!'
class
Dog(Animal):
def
talk(
self
):
return
'Woof! Woof!'
animals
=
[Cat(
'Missy'
),
Dog(
'Lassie'
)]
for
animal
in
animals:
print
animal.name
+
': '
+
animal.talk()
|