Python3 面向對象與面向函數的對比使用(見解)
Python版本
:3.7.2
Python IDE編輯器
:Pycharm
首先,我們需要明確我們的業務需求,根據業務方面來去制定實現需求的方案。
簡單明瞭來說,你現在需要做個
WEB後端
。那麼,你的代碼(使用
Tornado
庫)很有可能是這個樣子的。
# -*- coding:utf-8 -*-
import ***
from *** import ***
class MainHandler(Request, ABC):
def get(self):
self.render('index.html')
if __name__ == '__main__':
***
***
這只是個例子,一般情況下,我們會將運行文件命名爲
Main.py
,並且使用
if __name__ == '__main__'
來去限制執行。這麼做,不僅僅是爲了以當前文件執行,同時也方便我們在平常開發時進行調試和修改。
上面所講的,只是面向對象的一個典型用法。這在處理一些主副場景時,會十分好用。
同樣的,這對於單一場景也是非常友好的。
比方說,我們對於這樣的場景,會有很多種不同的寫法。
主業務 |----> 業務點 1 |----> 業務點 2 |----> 業務點 3
對應的面向對象代碼(OOP-Code)
# -*- coding:utf-8 -*- class Main(): def get(self): print("業務1") def post(self): print("業務2") def delete(self): print("業務3") def update(self): print("業務4") if __name__ == '__main__': main = Main() main.get()
這麼編寫,可以解決各個業務點之間的耦合問題。同樣的,如果我們在從事開發職業,順帶了解運維職業中的架構解耦。這對於我們編寫更優秀的代碼有着很大的幫助。
現在,我們聊一聊對面向函數編程的使用。同時,博主會在寫的過程中,將OOP和麪向函數共同使用順帶講解。
# -*- coding:utf-8 -*-
def DB():
connect = Client('*****')
class Main():
def get(self):
DB()
class Accept():
def post():
DB()
if __name__ == '__main__':
main = Main()
accept = Accept()
在當前這個文件中,我們可以看到定義函數
和定義類
兩種使用方式。這其中,我們將數據庫操作放在了DB
中,而在get()
和post()
中使用它。這也就意味着,主業務使用解耦方式來去構建代碼,而實現主業務的通用代碼放在構建函數中。
當然,博主說的話不一定對。因爲在很多
Python第三方庫中
,庫作者爲了將更多的功能和更簡潔的思想融入進更簡短的代碼中。面向函數式並不太適合於這一行爲。
比方說,
Redis
的操作有很多種,那麼我們只想實例化一次,但每一次的操作都是全新的(不同的)。那麼我們可以看一下面的代碼。redis = Redis() redis.get() redis.set() redis.keys() redis.del()
在使用過程中,我們確確實實只實例化了一次,但這一次實例化操作將它的方法全部帶入進來。在使用的過程中,我們不需要記住我們編寫方法的名字,因爲在每一次調用時
redis.
IDE都會提示我們。但如果我們將這種方式轉換爲面向函數寫法,很可能代碼將面臨一種淺層次相互依賴的關係。
舉個更爲簡單的例子,在
Docker
中,我們將每一個應用都視爲一個容器。這樣做的目的是一個擁有複雜或簡單依賴的應用全部包含在一個環境中。並且,這個環境不會影響其他與它同級的容器。這便是簡易版集裝箱
,也是Docker
的一種雲應用方式。
說到這裏,博主千言萬語都壓縮成這篇簡短的話語。對於是否使用,或者有必要改變開發者的書寫習慣,這無關緊要。最重要的是,在編寫代碼過程中,循序漸進!不要嘗試思想上的跳級。