python程式設計分為三個階段:
- 面向過程程式設計:根據業務邏輯從上到下壘
- 函數式程式設計:将某功能進行函數封裝,使用時調用函數即可,減少代碼重複量
- 面向對象程式設計:對函數進行分類和封裝
理論上我們是比較鄙視面向過程程式設計的,那麼問題來了,那函數式程式設計和面向對象程式設計我們該用哪個呢?
先來看兩個的特點吧:
- 函數程式設計,邏輯清晰,簡單,為項目而生,維護困難,函數式程式設計提倡的解決方案是資料是不可變的, 就沒有了一直在改變的狀态, 進而降低了複雜度.
- 面向對象,大而全,複雜,為大項目而生,開發周期長,理論上長久維護簡單,實際上一塌糊塗...面向對象一個最大的特點是抽象, 是以面向對象式程式設計特别适合處理業務邏輯,是以被廣泛應用于目前的軟體開發當中.
總結
- 那麼什麼情況下用面向對象呢?當某一些函數具有相同參數時,可以使用面向對象的方式,将參數值一次性的封裝到對象,以後去對象中取值即可,我覺得這個是對于我這種初學者的最簡答案了吧...
- 什麼時候使用函數式程式設計呢?各個函數之間是獨立且無共用的資料
類和對象的建立
面向對象程式設計方式的落地,需要使用類和對象來實作:
- 類可以看為一個模闆,模闆了包含了多個函數,函數實作某些功能
- 對象是根據模闆建立的執行個體,通過執行個體對象可以調用類中的功能函數

- class是關鍵詞,聲明建立一個類
- 類後面加(),表示建立對象
- 類中定義函數時,第一個參數必須為self,而類中的函數稱為方法
面向對象的三大特性
- 封裝
- 繼承
- 多态
面向對象之封裝
封裝就是将内容封裝到某個地方,以後再去調用被封裝在某處的内容,在使用面向對象的封裝特性時,需要:
- 将内容封裝到某處
- 從某處調用被封裝的内容
#!/usr/bin/env python
#-*- coding:utf-8 -*-
class Port:
def __init__(self,total):
"""
__init__稱之為構造方法
:param total: Port類傳遞的參數
"""
self.total = total
def num(self):
print(self.total)
obj = Port('123')
obj.num()
面向對象之繼承基礎
繼承,面向對象中的繼承和現實生活中的繼承相同,即:子可以繼承父的内容。
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
class People:
def __init__(self):
print("""
你的通用特征有:四肢、頭發、眼、耳朵
""")
class China(People):
def info(self):
print("""
你是中國人,你的語言是中文,皮膚是黃色
""")
class Us(People):
def info(self):
print("""
你是美國人,你的語言是英文,皮膚是黑色
""")
c = China()
c.info()
m = Us()
m.info()
多繼承
python中的繼承可以多繼承,意思就是一個子類可以有多個父類,比如:
多繼承中需要注意的是:
- 多繼承時,按照繼承的順序排優先級c3(c2,c1)
深度優先,無共同父類,多繼承方式
圖待定……
面向對象中的類成員
- 字段
- 方法
- 屬性
字段
字段分為兩種:
- 普通字段
- 靜态字段
普通字段我們使用的較多,一般是在構造方法時使用.
靜态字段在代碼加載時已經建立
字段 | 儲存位置 | 規則 |
---|---|---|
普通字段 | 儲存在對象中 | 隻能用對象去通路 |
靜态字段 | 儲存在類中(節約記憶體空間) | 對象/類均可通路,但一般使用類通路,萬不得已才使用對象通路) |
方法
所有方法都屬于類,類基本可以分為三中類型:
- 普通方法
- 靜态方法
- 類方法
方法 | 調用方式 | 特征 |
---|---|---|
普通方法 | 由對象去調用執行,屬于類 | 至少一個self,對象調用 |
靜态方法 | 屬于類,但通過類來調用,不依賴于任何對象,方法内部不需要對象封裝的值時,可使用靜态方法 | 任意參數,沒有self,上面添加@staticmethod,類似裝飾器的東東 |
類方法 | 靜态方法的一種特殊形式,由類調用 | 至少一個cls參數,上面添加classmethod |
靜态方法:
class Province:
country='中國' #靜态字段
def __init__(self,name):
self.name=name #普通字段
@staticmethod #靜态方法
def show(arg1,arg2):
print(arg1,arg2)
print(Province.country)
hn=Province('HN')
print(hn.country)
Province.show(123,456) #靜态方法調用
屬性
屬性的特征:具有方法的寫作形式,具有字段的通路形式.可取值,可設定,可删除.
先來看看屬性是個什麼東西吧:
class Pager:
def __init__(self,all_count):
self.all_count=all_count
@property #定義屬性
def all_pager(self):
a1,a2=divmod(self.all_count,10)
if a2==0:
return a1
else:
return a1+1
@all_pager.setter #指派屬性,将value指派給方法的參數
def all_pager(self,value):
print(value)
@all_pager.deleter #删除屬性
def all_pager(self):
print('del all_pager')
obj=Pager(101)
ret=obj.all_pager #不需要加括号
print(ret)
obj.all_pager=102
del obj.all_pager
屬性的基本使用
屬性的定義和調用需要注意以下幾點:
- 定義時,在普通方法的基礎上添加@property裝飾器
- 定義時,屬性僅有一個self參數
- 調用時,無需括号,obj.all_paper
屬性存在的意義:通路屬性時,可以制造出和通路字段完全相同的假象,由于屬性是由方法變種而來,如果python中沒有屬性,完全可以由方法來替代.
屬性的兩種定義方式
python3中全都是新式類,有三種@property裝飾方式:
- @property
- 方法名.setter
- 方法名.deleter
其實就像上面的例子.
還有一種方式是靜态字段方式.建立值為property的對象的靜态字段.
來看個例子:
class Pager:
def __init__(self,name):
self.name=name
def f1(self):
return 123
def f2(self,value):
print(value)
def f3(self):
print('del....')
foo=property(fget=f1,fset=f2,fdel=f3)
obj=Pager(110)
ret=obj.foo #調用fget
print(ret)
obj.foo=778 #調用fset
del obj.foo #調用fdel
類方法
類方法通過@classmethod裝飾器實作,類方法和普通方法的差別是, 類方法隻能通路類變量,不能通路執行個體變量
class StudentManagement(object):
@classmethod
def register(cls, school, course):
student = Student(school=school, course=course)
return student
@classmethod
def pay(cls, student, money):
money = student.payment(paymoney=money)
return {
'student': student,
'paymoney': money
}
@classmethod
def select_class(cls, student, class_):
student.select_class_(class_=class_)
return {
'course': class_.course.name,
'teacher': class_.teacher.name,
}
轉載于:https://www.cnblogs.com/patrick0715/p/5832586.html