一、面向?qū)ο?/p> 1、面向過程 a、優(yōu)點(diǎn):極大的降低了寫程序的復(fù)雜度,只需要順著執(zhí)行的步驟,堆疊代碼即可 b、缺點(diǎn):一套流水線或者流程就是來解決一個(gè)問題,代碼就是牽一發(fā)而東莞全身 2、面向?qū)ο?/p> a、優(yōu)點(diǎn):解決程序的擴(kuò)展性,對(duì)某一個(gè)對(duì)象單獨(dú)修改,會(huì)立刻反應(yīng)到整個(gè)體系中 b、缺點(diǎn):可控性差,無法向面向過程的程序設(shè)計(jì)流水線式的可以很精準(zhǔn)的預(yù)測問題的處理流程與結(jié)果,面向?qū)ο蟮某绦蛞坏╅_始就有對(duì)象之間的交互解決問題。 3、 類:具有相同特征的一類事物(人、狗、老虎) 4、對(duì)象/實(shí)例:具體的某一個(gè)事物(隔壁阿花、樓下旺財(cái)) 5、實(shí)例化:類——>對(duì)象的過程 6、 在python中,用變量表示特征,用函數(shù)表示技能,因而具有相同特征和技能的一類事物就是‘類’, 7、對(duì)象是則是這一類事物中具體的一個(gè) class Person: #定義一個(gè)人類 role = 'person' #人的角色屬性都是人 def walk(self): #人都可以走路,也就是有一個(gè)走路方法,也叫動(dòng)態(tài)屬性 print('person is walking...') class 類名: 類屬性 = None def __init__(self,對(duì)象屬性): self.對(duì)象屬性 = 對(duì)象屬性 def 方法名(self): pass實(shí)例 = 類名(10) 實(shí)例.方法名() 8、類的兩種作用:屬性引用和實(shí)例化 9、屬性引用(類名.屬性) class Person: #定義一個(gè)人類 role = 'person' #人的角色屬性都是人 def walk(self): #人都可以走路,也就是有一個(gè)走路方法 print('person is walking...')print(Person.role) #查看人的role屬性print(Person.walk) #引用人的走路方法,注意,這里不是在調(diào)用。小編推薦一個(gè)學(xué)Python的學(xué)習(xí)裙【五八八,零九零,九四二】,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有很多干貨和技術(shù)分享 10、例化:類名加括號(hào)就是實(shí)例化,會(huì)自動(dòng)觸發(fā)__init__函數(shù)的運(yùn)行,可以用它來為每個(gè)實(shí)例定制自己的特征 class Person: #定義一個(gè)人類 role = 'person' #人的角色屬性都是人 def __init__(self,name): self.name = name # 每一個(gè)角色都有自己的昵稱; def walk(self): #人都可以走路,也就是有一個(gè)走路方法 print('person is walking...')print(Person.role) #查看人的role屬性print(Person.walk) #引用人的走路方法,注意,這里不是在調(diào)用 11、 類名 類名.類屬性 類名.方法名 實(shí)例 = 類名(參數(shù),參數(shù)) #實(shí)例就是對(duì)象實(shí)例 實(shí)例.方法名() 實(shí)例.對(duì)象屬性 實(shí)例增加屬性 實(shí)例.新的屬性名 = 1000print(實(shí)例.新的屬性名) 12、關(guān)于self self:在實(shí)例化時(shí)自動(dòng)將對(duì)象/實(shí)例本身傳給__init__的第一個(gè)參數(shù),你也可以給他起個(gè)別的名字. 對(duì)象/實(shí)例只有一種作用:屬性引用 class 類名: def __init__(self,參數(shù)1,參數(shù)2): self.對(duì)象的屬性1 = 參數(shù)1 self.對(duì)象的屬性2 = 參數(shù)2 def 方法名(self):pass def 方法名2(self):pass對(duì)象名 = 類名(1,2) #對(duì)象就是實(shí)例,代表一個(gè)具體的東西 #類名() : 類名+括號(hào)就是實(shí)例化一個(gè)類,相當(dāng)于調(diào)用了__init__方法 #括號(hào)里傳參數(shù),參數(shù)不需要傳self,其他與init中的形參一一對(duì)應(yīng) #結(jié)果返回一個(gè)對(duì)象對(duì)象名.對(duì)象的屬性1 #查看對(duì)象的屬性,直接用 對(duì)象名.屬性名 即可對(duì)象名.方法名() #調(diào)用類中的方法,直接用 對(duì)象名.方法名() 即可 dir(類) #返回類中的所有名字列表isinstance(對(duì)象,類) #判斷對(duì)象是否為類的實(shí)例print(Person.__dict__) # 返回一個(gè)字典 key是屬性名,value是屬性值print(Person.__module__) #person類所在的模塊print(Person.__name__,type(Person.__name__)) #字符串?dāng)?shù)據(jù)類型的類名 13、類命名空間與對(duì)象、實(shí)例的命名空間 a、常見一個(gè)類就會(huì)創(chuàng)建一個(gè)類的名稱空間,用來儲(chǔ)存類中定義的所有名字,這些名字成為類的屬性 b、而類有兩種屬性:靜態(tài)屬性和動(dòng)態(tài)屬性 靜態(tài)屬性就是直接在類中定義的變量 動(dòng)態(tài)屬性就是定義在類中的方法 創(chuàng)建一個(gè)對(duì)象/實(shí)例就會(huì)創(chuàng)建一個(gè)對(duì)象/實(shí)例的名稱空間,存放對(duì)象/實(shí)例的名字,稱為對(duì)象/實(shí)例的屬性 面相對(duì)象的組合用法: 組合指的是,在一個(gè)類中以另外一個(gè)類的對(duì)象作為數(shù)據(jù)屬性,稱為類的組 列子: 圓的周長與面積 14、面向?qū)ο蟮娜筇卣?/p> a、繼承 class Animal: #父類 基類 超類 def __init__(self,name,life_value,aggr): self.name = name self.life_value = life_value self.aggr = aggrclass Person(Animal): #子類 派生類 passclass Dog(Animal): #子類 派生類 passegg = Person('egon',1000,50)print(egg.name)print(egg.aggr python2class Dad: #經(jīng)典類class Dag(object) #新式類python3class Dad == class Dag(object) #新式類 1、繼承的語法 class 類名(父類名): 想在子類中實(shí)現(xiàn)調(diào)用父類的方法 在類內(nèi) ——super(子類名,self).方法名() 在類外面 ——super(子類名,對(duì)象名).方法名() 如果不指定繼承的父類,默認(rèn)繼承object 子類可以使用父類的所有屬性和方法 如果子類有自己的方法就執(zhí)行自己的的 如果是子類沒有的方法就執(zhí)行父類的 如果子類父類都沒有這個(gè)方法就報(bào)錯(cuò) 繼承、抽象、派生 繼承 是從大范圍到小范圍 抽象 小范圍到大范圍 派生 就是在父類的基礎(chǔ)上又產(chǎn)生子類——派生類 父類里沒有的 但子類有的 ——派生方法 派生屬性 方法的重寫 父類里有的方法,在子類里重新實(shí)現(xiàn) 2、繼承的兩種用途: b:繼承基類的方法,并且做出自己的改變或者擴(kuò)展(代碼重用) a:聲明某個(gè)子類兼容于某基類,定義一個(gè)接口類Interface,接口類中定義 了一些接口名(就是函數(shù)名)且并未實(shí)現(xiàn)接口的功能,子類繼承接口類,并且實(shí)現(xiàn)接口中的功能 b、封裝 1、優(yōu)點(diǎn): a、將變化隔離 b、封裝使用 c、提高復(fù)用性 d、提高安全性 2、封裝原則: a、將不需要對(duì)外提供的內(nèi)容都隱藏起來 b、把屬性都隱藏起來提供公共方法對(duì)其訪問 3、私有變量和私有方法 a、在python中用雙劃線的開頭的的方式降屬性隱藏起來(設(shè)置私有的) property屬性 property是一種特殊的屬性,訪問它時(shí)會(huì)執(zhí)行一段功能(函數(shù))然后返回值 c、多態(tài):”多態(tài)指的是一類事物有多種形態(tài)(比如:老師.下課鈴響了(),學(xué)生.下課鈴響了(),老師執(zhí)行的是下班操作,學(xué)生執(zhí)行的是放學(xué)操作,雖然二者消息一樣,但是執(zhí)行的效果不同) 多態(tài)指的是:一類實(shí)物有多種狀態(tài) python自帶多態(tài): 多態(tài):同一類事物的多種狀態(tài) python里處處都是多態(tài),只是我們一般發(fā)現(xiàn)不了 操作的時(shí)候不需要關(guān)心這個(gè)對(duì)象的數(shù)據(jù)類型,你只要用就行了 15、反射 1、 反射:可以用字符串的方式去訪問對(duì)象的屬性,調(diào)用對(duì)象的方法(但是不能去訪問方法),python中一切皆對(duì)象,都可以使用反射。 2、反射有四種方法: hasattr:hasattr(object,name)判斷一個(gè)對(duì)象是否有name屬性或者name方法。有就返回True,沒有就返回False getattr:獲取對(duì)象的屬性或者方法,如果存在則打印出來。hasattr和getattr配套使用 需要注意的是,如果返回的是對(duì)象的方法,返回出來的是對(duì)象的內(nèi)存地址,如果需要運(yùn)行這個(gè)方法,可以在后面添加一對(duì)() setattr:給對(duì)象的屬性賦值,若屬性不存在,先創(chuàng)建后賦值 delattr:刪除該對(duì)象指定的一個(gè)屬性 a、內(nèi)置方法:isinstance和issubclass isinstance(obj,cls)檢查是否obj是否是類 cls 的對(duì)象 class Foo: passclass Son(Foo): passs=Son()print(isinstance(s,Son)) b、內(nèi)置方法:issubclass(sub, super)檢查sub類是否是 super 類的派生類 class Foo(object): pass class Bar(Foo): pass issubclass(Bar, Foo) c、python面向?qū)ο笾械姆瓷洌和ㄟ^字符串的形式操作對(duì)象相關(guān)的屬性,python中一切事物都是對(duì)象(都可以用反射) 檢查是否含有某屬性---hasattr 返回布爾值 獲取屬性---getattr 沒有就會(huì)報(bào)錯(cuò) 設(shè)置屬性---setattr 刪除屬性---delattr d、內(nèi)置方法:__del__ 析構(gòu)方法,當(dāng)對(duì)象在內(nèi)存中被釋放時(shí),自動(dòng)觸發(fā)執(zhí)行。 注:此方法一般無須定義,因?yàn)镻ython是一門高級(jí)語言,程序員在使用時(shí)無需關(guān)心內(nèi)存的分配和釋放,因?yàn)榇斯ぷ鞫际墙唤oPython解釋器來執(zhí)行,所以,析構(gòu)函數(shù)的調(diào)用是由解釋器在進(jìn)行垃圾回收時(shí)自動(dòng)觸發(fā)執(zhí)行的。 class Foo: def __del__(self): print('fgs') f=Foo()print(123)print(123)del fprint(123)print(123)print(123) e、內(nèi)置方法:item系列 __getitem__\__setitem__\__delitem__ __new__ class A: def __init__(self): #有一個(gè)方法在幫你創(chuàng)造self print('in init function') self.x=1 def __new__(cls, *args, **kwargs): print('in init funct') return object.__new__(A,*args,**kwargs) a=A() f、__str__和__repr__改變對(duì)象的字符串顯示 __str__,__repr__ 15、內(nèi)置方法 a、靜態(tài)方法和類方法 1、類方法:有個(gè)默認(rèn)參數(shù)cls,并且可以直接用類名去調(diào)用,可以與類屬性交互(也就是可以使用類屬性) 2、靜態(tài)方法:讓類里的方法直接被類調(diào)用,就像正常調(diào)用函數(shù)一樣 b、類方法和靜態(tài)方法的相同點(diǎn):都可以直接被類調(diào)用,不需要實(shí)例化 c、類方法和靜態(tài)方法的不同點(diǎn): 類方法必須有一個(gè)cls參數(shù)表示這個(gè)類,可以使用類屬性 靜態(tài)方法不需要參數(shù) d、綁定方法:分為普通方法和類方法 普通方法:默認(rèn)有一個(gè)self對(duì)象傳進(jìn)來,并且只能被對(duì)象調(diào)用-------綁定到對(duì)象 類方法:默認(rèn)有一個(gè)cls對(duì)象傳進(jìn)來,并且可以被類和對(duì)象(不推薦)調(diào)用-----綁定到類 e、非綁定方法:靜態(tài)方法:沒有設(shè)置默認(rèn)參數(shù),并且可以被類和對(duì)象(不推薦)調(diào)用-----非綁定 16、接口類與抽象類 a、 接口類:(在抽象類的基礎(chǔ)上) 在python中,默認(rèn)是沒有接口類的 接口類不能被實(shí)例化(如果實(shí)例化會(huì)報(bào)錯(cuò)) 接口類中的方法不能被實(shí)現(xiàn) 接口也就是做約束,讓下面的類的方法都按照接口類中給出的方法去定義。如果接口類里面有的方法類里面沒有,那么那個(gè)類就不能被實(shí)例化。(字面理解) 繼承的第二種含義非常重要。它又叫“接口繼承”。 接口繼承實(shí)質(zhì)上是要求“做出一個(gè)良好的抽象,這個(gè)抽象規(guī)定了一個(gè)兼容接口,使得外部調(diào)用者無需關(guān)心具體細(xì)節(jié),可一視同仁的處理實(shí)現(xiàn)了特定接口的所有對(duì)象”——這在程序設(shè)計(jì)上,叫做歸一化。 b、抽象類 在python中,默認(rèn)是有的 父類的方法,子類必須實(shí)現(xiàn) 抽象類(父類)的方法可以被實(shí)現(xiàn) 抽象類和接口類的區(qū)別:接口類不能實(shí)現(xiàn)方法,抽象類可以實(shí)現(xiàn)方法里面的內(nèi)容 抽象類和接口類的相同點(diǎn):都是用來做約束的,都不能被實(shí)例化 抽象類和接口類的使用: 當(dāng)幾個(gè)子類的父類有相同的功能需要被實(shí)現(xiàn)的時(shí)候就用抽象類 當(dāng)幾個(gè)子類有相同的功能,但是實(shí)現(xiàn)各不相同的時(shí)候就用接口類 |
|