前言
其實,在寫這一篇文章之前我是十分糾結的,我在想到底是用世界觀來闡述面向對象思想還是站在程序功能的角度去闡述面向對象思想,最終我決定使用兩方面的角度來闡述面向對象這個概念,請記住:編程思想只是一種思想,與任何語言都無關,不要覺得面向對象就一定比面向過程好,實際上恰恰相反。面向過程才是所有代碼在內存中最終的狀態。
面向過程編程思想
特性:模塊化 流程化
優點:性能比面向對象高, 因為類調用時需要實例化,開銷比較大,比較消耗資源;
單片機、嵌入式開發、Linux/Unix等一般采用面向過程開發,性能是最重要的因素。
缺點:沒有面向對象易維護、易復用、易擴展
面向過程的思想就在於將一個問題逐步解決,將大問題分解成各種小步驟一步一步去執行,一旦完成基本很少會有改變的場景,著名的例子有Linux內核
,git
等等。優點是代碼可讀性較高。並且他也是很多初學者最開始的一種思維方式,更多的是關心下一步操作該怎么做,以正在發生為目的。
name = "老王" # 第一步:買茶壺和茶葉 print("老王在超市買了一個茶壺和一袋茶葉...") # 第二步:取水 print("老王拿出了珍藏已久的農夫山泉...") # 第三步:生火 print("老王掏出打火機,點燃了一堆木屑...") # 第四步:泡茶 def teapot(water,tea): print("正在泡茶啊") print("咕嚕嚕。。茶葉泡好了") return "使用{0}泡好的{1}".format(water,tea) print("老王正在泡茶..") # 第五步:喝茶 res = teapot("農夫山泉","鐵觀音") print("老王正在喝...",res)
函數式編程思想
特點:無變量,無for循環
優點:代碼重復率低
缺點:程序易讀性差
函數式編程是與數學函數高度結合的編程方式,純粹的函數式編程語言沒有變量只有常量,代碼重復率較低,且功能一旦完善就不會出錯,在函數中沒有for
循環,所有的for
循環用遞歸實現,函數式編程的一個特點就是允許把函數本身作為參數傳入另一個參數,還允許返回一個函數。此外,Python中的lambda
以及filter
,map
,reduce
等等都是從函數式編程中提取出來的一些優秀且符合Python核心思想的好案例。
# 自定義重現map res = map(lambda x:x-1,[i for i in range(10)]) print(list(res)) def my_map(func,iterableser): res = [] count = 0 def process(func,iterableser,count): if len(iterableser): res.append(func(iterableser.pop(count))) process(func, iterableser, count) else: return process(func,iterableser,count) count+=1 return res res = my_map(lambda x:x-1,[i for i in range(10)]) print(res)
面向對象編程思想
特性:抽象 封裝 繼承 多態
優點:易維護、易復用、易擴展,由於面向對象有封裝、繼承、多態性的特性,可以設計出低耦合的系統,使系統更加靈活、更加易於維護
缺點:性能比面向過程低
從世界觀的角度闡述面向對象思想
對象:具體某一類的實際體
類:抽象的概念,實際上是不存在的
面向對象是一種思想,從世界觀的角度可以認為:面向對象的基本哲學是認為世界是由各種各樣具有自己的運動規律和內部狀態的對象所組成的;不同對象之間的相互作用和通訊構成了完整的現實世界。因此,人們應當按照現實世界這個本來面貌來理解世界,直接通過對象及其相互關系來反映世界。這樣建立起來的系統才能符合現實世界的本來面目。
而從方法學的角度可以認為:面向對象的方法是面向對象的世界觀在開發方法中的直接運用。它強調系統的結構應該直接與現實世界的結構相對應,應該圍繞現實世界中的對象來構造系統,而不是圍繞功能來構造系統。
class
並不等於 面向對象 .... 而是屬於Python里面向對象編程中的一種語法:
def dog(name,sex,colour): def init(name,sex,colour): dic1 = { "name":name, "sex":sex, "colour":colour, "bark":bark, "get_angry":get_angry, } return dic1 def bark(dic1): print("一只{0}顏色的{1}狗,它的名字是{2},它現在在朝你汪汪叫".format(dic1["colour"],dic1["sex"],dic1["name"])) def get_angry(dic1): print("{0}生氣了,它朝你撲過來了!".format(dic1["name"])) return init(name,sex,colour) d1 = dog("大黃","公","黃") print(d1) d1["bark"](d1) d1["get_angry"](d1)
class Dog(object): def __init__(self,name,sex,colour): self.name = name self.sex = sex self.colour = colour def bark(self): print("一只{0}顏色的{1}狗,它的名字是{2},它現在在朝你汪汪叫".format(self.colour,self.sex,self.name)) def get_angry(self): print("{0}生氣了,它朝你撲過來了!".format(self.name)) d1 = Dog("大黃","公","黃") print(d1) d1.bark() d1.get_angry()
使用class
和上面def
定義的思想都是一樣的,他們同屬於面向對象程式設計,但是class
更為方便,還具備一些def
不具備的功能。
請記住,用面向對象語言寫程序,和一個程序的設計是屬於面向的對象設計是兩種不同的概念,八桿子打不着。你可以用class
去利用面向過程的方式寫代碼,當然也可以用def
設計成面向對象的程序。
從程序功能角度來闡述面向對象思想
對象:存放數據與功能集合體的容器,也可稱之為屬性與方法。
類:類也是對象,存放具體實例對象公用的一些數據和功能。
面向對象的核心點在於對象二字,一切可以存放數據和功能的容器皆可稱之為對象,面向對象實際上如果你真的已經接觸過有一些時間了你會發現什么世界觀的面向對象全是扯淡,我就覺得它的一個功能很強大!封裝使用!用它來裝東西使用非常方便!對,使用對象來裝東西簡直不要太好用。
其實從程序功能角度來分析面向對象沒什么好說的,用多了之后就會知道。別跟我扯什么有用沒用的,我就是這么用面向對象的。你可以說我low,但是我告訴你我根本做不到將現實世界的投影完全存放到程序中,對我來說這是扯淡。
有了面向對象我能做什么:
class Server(object): ip = "127.0.0.1" port = 8008 def __init__(self): self.__state = None def run(self): """啟動服務""" print("本機IP:[{0}] 端口:[{1}] 服務啟動成功".format(Server.ip, Server.port)) self.__state = 1 def stop(self): """停止服務""" self.__state = 0 print("正在停止服務") def get_status(self): if self.__state == 1: print("正在運行") else: print("沒有運行") def send_client(self,clent_ip): print("本機IP [{0}] 正在向目標IP [{1}] 發送數據".format(Server.ip, clent_ip)) server1 = Server() server1.run() server1.send_client("127.0.0.23") server1.stop() server1.get_status() # 我用面向對象就是這樣,一些公共的數據我想要了我就從類里面去拿,沒有了我就實例化自己造。 # 我覺得它的使用很方便,讓代碼看起來很整潔,我就這樣用,有問題嗎?