一.什么是面向?qū)ο蟮某绦蛟O(shè)計(jì)為什么要有它
成都創(chuàng)新互聯(lián)云計(jì)算的互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)13年的服務(wù)器租用、達(dá)州服務(wù)器托管、云服務(wù)器、網(wǎng)站空間、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn),已先后獲得國(guó)家工業(yè)和信息化部頒發(fā)的互聯(lián)網(wǎng)數(shù)據(jù)中心業(yè)務(wù)許可證。專業(yè)提供云主機(jī)、網(wǎng)站空間、域名申請(qǐng)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
1.面向過(guò)程的程序設(shè)計(jì):核心是過(guò)程二字,過(guò)程指的是解決問(wèn)題的步驟,即先干什么再干什么......面向過(guò)程的編程就好比設(shè)計(jì)一條流水線,是一種機(jī)械式的思維方式。
優(yōu)點(diǎn)是:復(fù)雜的問(wèn)題流程化,進(jìn)而簡(jiǎn)單化
缺點(diǎn)是:一套流水線或者流程就是用來(lái)解決一個(gè)問(wèn)題,生產(chǎn)汽水的流水線無(wú)法生產(chǎn)汽車,即便是能,也得是大改,改一個(gè)組件,牽一發(fā)而動(dòng)全身。
應(yīng)用場(chǎng)景:一旦完成基本很少改變的場(chǎng)景,著名的例子有Linux內(nèi)核,git,以及Apache HTTP Server等
2.面向?qū)ο蟮某绦蛟O(shè)計(jì):核心是對(duì)象二字,對(duì)象是特征與技能的結(jié)合體,基于面向?qū)ο笤O(shè)計(jì)程序就好比在創(chuàng)造一個(gè)世界,你就是這個(gè)世界的上帝,存在的皆為對(duì)象,不存在的也可以創(chuàng)造出來(lái),與面向過(guò)程的思維方式形成鮮明的對(duì)比,面向?qū)ο蟾又匾晫?duì)現(xiàn)實(shí)世界的模擬,是一種“上帝式”的思維方式
優(yōu)點(diǎn)是:解決了程序的擴(kuò)展性。對(duì)某一個(gè)對(duì)象單獨(dú)修改,會(huì)立刻反應(yīng)在整個(gè)體系中。
缺點(diǎn)是:編程復(fù)雜度遠(yuǎn)高于面向過(guò)程
應(yīng)用場(chǎng)景:需求經(jīng)常變化的軟件,一般需求的變化都集中在用戶層,互聯(lián)網(wǎng)應(yīng)用,企業(yè)內(nèi)部軟件,游戲等都是面向?qū)ο蟮某绦蛟O(shè)計(jì)大顯身手的好地方
二.類與對(duì)象
類:對(duì)象是特征與技能的結(jié)合體,而類則是一系列對(duì)象相同的特征與技能的結(jié)合體
強(qiáng)調(diào):
1.對(duì)象是具體存在的事物,而類則一個(gè)抽象的概念
2.站在不同的角度總結(jié)出的類與對(duì)象是不同的
在現(xiàn)實(shí)世界中:先有一個(gè)個(gè)具體存在的對(duì)象,然后隨著人類文明的發(fā)展才總結(jié)出類的概念
在程序中: 先定義類,后調(diào)用類來(lái)產(chǎn)生對(duì)象
1.先定義類 class OldboyStudent: #相同的特征 school = 'oldboy' #相同的技能 def choose_course(self): print('choosing course') #類是一系列對(duì)象相同的特征(變量)與技能(函數(shù))的結(jié)合體,即類體中最常見(jiàn)的就是變量與函數(shù)的定義 # 但其實(shí)類體中是可以存在任意python代碼的 # 類體代碼會(huì)在類定義階段立即執(zhí)行,會(huì)產(chǎn)生一個(gè)類名稱空間,用來(lái)將類體代碼執(zhí)行過(guò)程中產(chǎn)生的名字都丟進(jìn)去,查看方式如下 # print(OldboyStudent.__dict__) # 查看類的名稱空間 # print(OldboyStudent.school) #print(OldboyStudent.__dict__['school']) # print(OldboyStudent.choose_course) # OldboyStudent.school='OLDBOY' #OldboyStudent.__dict__['school']='OLDBOY' # OldboyStudent.country='China' #OldboyStudent.__dict__['country']='China' # del OldboyStudent.country # del OldboyStudent.__dict__['country'] # print(OldboyStudent.__dict__) # 總結(jié): #1. 類本質(zhì)就是一個(gè)名稱空間,或者說(shuō)是一個(gè)用來(lái)存放變量與函數(shù)的容器 #2. 類的用途之一就是當(dāng)做名稱空間從其內(nèi)部取出名字來(lái)使用 #3. 類的用途之二是調(diào)用類來(lái)產(chǎn)生對(duì)象 2.后調(diào)用類來(lái)產(chǎn)生對(duì)象 # s1=OldboyStudent() # s2=OldboyStudent() # s3=OldboyStudent() #如此,s1、s2、s3都一樣了,而這三者除了相似的屬性之外還各種不同的屬性,這就用到了__init__ #注意:該方法是在對(duì)象產(chǎn)生之后才會(huì)執(zhí)行,只用來(lái)為對(duì)象進(jìn)行初始化操作,可以有任意代碼,但一定不能有返回值 class OldboyStudent: ...... def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex ...... s1=OldboyStudent('李坦克','男',18) #先調(diào)用類產(chǎn)生空對(duì)象s1,然后調(diào)用OldboyStudent.__init__(s1,'李坦克','男',18)s2=OldboyStudent('王大炮','女',38) s3=OldboyStudent('牛榴彈','男',78)#程序中對(duì)象的用法#執(zhí)行__init__,s1.name='牛榴彈',很明顯也會(huì)產(chǎn)生對(duì)象的名稱空間s2.__dict__{'name': '王大炮', 'age': '女', 'sex': 38} s2.name #s2.__dict__['name']s2.name='王三炮' #s2.__dict__['name']='王三炮's2.course='python' #s2.__dict__['course']='python'del s2.course #s2.__dict__.pop('course')
?。?!細(xì)說(shuō)_init__方法?。?!
# 方式一:為對(duì)象初始化自己獨(dú)有的特征 class People: country='China' x=1 def run(self): print('----->', self) # 實(shí)例化出三個(gè)空對(duì)象 obj1=People() obj2=People() obj3=People() # 為對(duì)象定制自己獨(dú)有的特征 obj1.name='egon' obj1.age=18 obj1.sex='male' obj2.name='lxx' obj2.age=38 obj2.sex='female' obj3.name='alex' obj3.age=38 obj3.sex='female' # print(obj1.__dict__) # print(obj2.__dict__) # print(obj3.__dict__) # print(People.__dict__) # 方式二、為對(duì)象初始化自己獨(dú)有的特征 class People: country='China' x=1 def __init__(obj, x, y, z): #obj=obj1,x='egon',y=18,z='male' obj.name = x obj.age = y obj.sex = z def run(self): print('----->', self) obj1=People('egon',18,'male') #People.__init__(obj1,'egon',18,'male') obj2=People('lxx',38,'female') #People.__init__(obj2,'lxx',38,'female') obj3=People('alex',38,'female') #People.__init__(obj3,'alex',38,'female') # __init__方法 # 強(qiáng)調(diào): # 1、該方法內(nèi)可以有任意的python代碼 # 2、一定不能有返回值 class People: country='China' x=1 def __init__(obj, name, age, sex): #obj=obj1,x='egon',y=18,z='male' # if type(name) is not str: # raise TypeError('名字必須是字符串類型') obj.name = name obj.age = age obj.sex = sex def run(self): print('----->', self) # obj1=People('egon',18,'male') # obj1=People(3537,18,'male') # print(obj1.run) # obj1.run() #People.run(obj1) # print(People.run) ?。?!__init__方法之為對(duì)象定制自己獨(dú)有的特征
三.屬性查找
類有兩種屬性:數(shù)據(jù)屬性和函數(shù)屬性
1.類的數(shù)據(jù)屬性是所有對(duì)象共享的
2.類的函數(shù)屬性是綁定給對(duì)象用的
#類的數(shù)據(jù)屬性是所有對(duì)象共享的,id都一樣 print(id(OldboyStudent.school)) print(id(s1.school)) print(id(s2.school)) print(id(s3.school)) ************** 4377347328 4377347328 4377347328 4377347328 ************** #類的函數(shù)屬性是綁定給對(duì)象使用的,obj.method稱為綁定方法,內(nèi)存地址都不一樣 #ps:id是python的實(shí)現(xiàn)機(jī)制,并不能真實(shí)反映內(nèi)存地址,如果有內(nèi)存地址,還是以內(nèi)存地址為準(zhǔn) print(OldboyStudent.learn) print(s1.learn) print(s2.learn) print(s3.learn) *******************> > > *******************
http://weahome.cn/article/ispsid.html