面向对象进阶篇
- 面向?qū)ο笫且环N編程方式,此編程方式的實(shí)現(xiàn)是基于對(duì)?類?和?對(duì)象?的使用
- 類 是一個(gè)模板,模板中包裝了多個(gè)“函數(shù)”供使用(可以講多函數(shù)中公用的變量封裝到對(duì)象中)
- 對(duì)象,根據(jù)模板創(chuàng)建的實(shí)例(即:對(duì)象),實(shí)例用于調(diào)用被包裝在類中的函數(shù)
- 面向?qū)ο笕筇匦?#xff1a;封裝、繼承和多態(tài)
類的成員
類的成員可以分為三大類:字段、方法和屬性
?
注:所有成員中,只有普通字段的內(nèi)容保存對(duì)象中,即:根據(jù)此類創(chuàng)建了多少對(duì)象,在內(nèi)存中就有多少個(gè)普通字段。而其他的成員,則都是保存在類中,即:無(wú)論對(duì)象的多少,在內(nèi)存中只創(chuàng)建一份。
一、字段
字段包括:普通字段和靜態(tài)字段,他們?cè)诙x和使用中有所區(qū)別,而最本質(zhì)的區(qū)別是內(nèi)存中保存的位置不同,
- 普通字段屬于對(duì)象
- 靜態(tài)字段屬于類
應(yīng)用場(chǎng)景: 通過(guò)類創(chuàng)建對(duì)象時(shí),如果每個(gè)對(duì)象都具有相同的字段,那么就使用靜態(tài)字段
二、方法
方法包括:普通方法、靜態(tài)方法和類方法,三種方法在內(nèi)存中都?xì)w屬于類,區(qū)別在于調(diào)用方式不同。
- 普通方法:由對(duì)象調(diào)用;至少一個(gè)self參數(shù);執(zhí)行普通方法時(shí),自動(dòng)將調(diào)用該方法的對(duì)象賦值給self;
- 類方法:由類調(diào)用; 至少一個(gè)cls參數(shù);執(zhí)行類方法時(shí),自動(dòng)將調(diào)用該方法的類復(fù)制給cls;
- 靜態(tài)方法:由類調(diào)用;無(wú)默認(rèn)參數(shù);
三、屬性
如果你已經(jīng)了解Python類中的方法,那么屬性就非常簡(jiǎn)單了,因?yàn)镻ython中的屬性其實(shí)是普通方法的變種。
對(duì)于屬性,有以下三個(gè)知識(shí)點(diǎn):
- 屬性的基本使用
- 屬性的兩種定義方式
- 調(diào)用時(shí),無(wú)需括號(hào)?
靜態(tài)字段方式,創(chuàng)建值為country對(duì)象的靜態(tài)字段
class Foo:#靜態(tài)字段country ="中國(guó)"def func(self):print("11") #類調(diào)用靜態(tài)方法 print(Foo.country) View Code類成員的修飾符
類的所有成員在上一步驟中已經(jīng)做了詳細(xì)的介紹,對(duì)于每一個(gè)類的成員而言都有兩種形式:
- 公有成員,在任何地方都能訪問(wèn)
- 私有成員,只有在類的內(nèi)部才能使用方法
私有成員和公有成員的定義不同:私有成員命名時(shí),前兩個(gè)字符是下劃線。(特殊成員除外,例如:__init__、__call__、__dict__等)
class Foo:#私有字段__yer = "Wyc"def func(self):#用類調(diào)用私有字段,只能在內(nèi)部調(diào)用。print(Foo.__yer) ret = Foo() ret.func() View Code class Foo:#公有靜態(tài)字段name = "中國(guó)"def func(self):pass#公有靜態(tài)字段由類調(diào)用 print(Foo.name) View Code類的特殊成員
?
?__doc__
表示類的描述信息
class Foo:"""這是__doc__的方法"""def func(self):pass#由類直接調(diào)用,類的注釋 print(Foo.__doc__) View Code class Foo:#構(gòu)造方法,簡(jiǎn)稱封裝def __init__(self):self.name = "wyc"def func(self):print(self.name) ret = Foo() ret.func() View Code__call__
對(duì)象后面加括號(hào),觸發(fā)執(zhí)行。
class Foo:def func(self):passdef __call__(self, *args, **kwargs):print("123") ret = Foo() ret() #對(duì)象后邊加括號(hào)自動(dòng)觸發(fā)__call__方法 View Code?__dict__
類或?qū)ο笾械乃谐蓡T
class Foo:def func(self):pass ret = Foo.__dict__ #查看類或?qū)ο笾械乃谐蓡T print(ret) View Code?__str__
如果一個(gè)類中定義了__str__方法,那么在打印 對(duì)象 時(shí),默認(rèn)輸出該方法的返回值。
class Foo: #默認(rèn)輸出該↓方法的默認(rèn)值def __str__(self):return "Wyc" ret = Foo() print(ret) View Code?__getitem__、__setitem__、__delitem__
用于索引操作,如字典。以上分別表示獲取、設(shè)置、刪除數(shù)據(jù)
class Foo:def __setitem__(self,key,value):print(key,value) r = Foo() r["xxx"] = 123 #對(duì)象后邊加中括號(hào)就會(huì)執(zhí)行__setitem__方法,一個(gè)key,一個(gè)value View Code?
class Foo:def __delitem__(self,key):print(key) r = Foo() del r["xxx"] #執(zhí)行__delitem__方法,刪除key View Code?
class Foo:def __getitem__(self, item):print(item) r = Foo() r["123456"] #對(duì)象后邊加個(gè)中括號(hào)就會(huì)自動(dòng)執(zhí)行 View Code?__iter__?
用于迭代器,之所以列表、字典、元組可以進(jìn)行for循環(huán),是因?yàn)轭愋蛢?nèi)部定義了 __iter_
class Foo(object):def __init__(self,sq):self.sq = sqdef __iter__(self):return iter(self.sq) obj = Foo([11,22,33,44,55]) for i in obj:print(i) View Code總結(jié):
成員:
? ? ?字段 ? ? ?靜態(tài)字段(每個(gè)對(duì)象都有一份),普通字段(每個(gè)對(duì)象都有不同的數(shù)據(jù))
? ? ?方法 ? ? ?靜態(tài)方法(無(wú)需使用對(duì)象封裝的內(nèi)容),類方法,普通方法(使用對(duì)象中的數(shù)據(jù))
? ? ?特性 ? ? ?普通特性(將方法偽造成字段)
如何快速判斷,類執(zhí)行,或者對(duì)象執(zhí)行:
? ? ? ? ? ? ? ? ?有self的對(duì)象調(diào)用
? ? ? ? ? ? ? ? ?無(wú)self的,類調(diào)用
總結(jié)
- 上一篇: 2017最新nginx+keepaliv
- 下一篇: 在EORow或者VORow中对数据进行重