![Python面向?qū)ο缶幊虒?zhuān)題培訓(xùn)課件_第1頁(yè)](http://file4.renrendoc.com/view/0db36ce70fe1c01d4cb6978289bb974c/0db36ce70fe1c01d4cb6978289bb974c1.gif)
![Python面向?qū)ο缶幊虒?zhuān)題培訓(xùn)課件_第2頁(yè)](http://file4.renrendoc.com/view/0db36ce70fe1c01d4cb6978289bb974c/0db36ce70fe1c01d4cb6978289bb974c2.gif)
![Python面向?qū)ο缶幊虒?zhuān)題培訓(xùn)課件_第3頁(yè)](http://file4.renrendoc.com/view/0db36ce70fe1c01d4cb6978289bb974c/0db36ce70fe1c01d4cb6978289bb974c3.gif)
![Python面向?qū)ο缶幊虒?zhuān)題培訓(xùn)課件_第4頁(yè)](http://file4.renrendoc.com/view/0db36ce70fe1c01d4cb6978289bb974c/0db36ce70fe1c01d4cb6978289bb974c4.gif)
![Python面向?qū)ο缶幊虒?zhuān)題培訓(xùn)課件_第5頁(yè)](http://file4.renrendoc.com/view/0db36ce70fe1c01d4cb6978289bb974c/0db36ce70fe1c01d4cb6978289bb974c5.gif)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Python面向?qū)ο缶幊蘌ython面向?qū)ο缶幊堂嫦驅(qū)ο蟮囊恍┗靖拍詈吞卣?/p>
類(lèi):用來(lái)描述具有相同屬性和方法的對(duì)象的集合,它定義該集合中每個(gè)對(duì)象所共有的屬性和方法,對(duì)象是類(lèi)的實(shí)例。類(lèi)變量:類(lèi)變量在整個(gè)實(shí)例化的對(duì)象中是公用的,類(lèi)變量定義在類(lèi)中且在函數(shù)體之外,類(lèi)變量通常不作為實(shí)例變量使用。數(shù)據(jù)成員:類(lèi)變量或者實(shí)例變量用于處理類(lèi)及其實(shí)例對(duì)象的相關(guān)數(shù)據(jù)。方法重寫(xiě):如果從父類(lèi)繼承的方法不能滿(mǎn)足子類(lèi)的需求,可以對(duì)其進(jìn)行改寫(xiě),這個(gè)過(guò)程叫方法的覆蓋(override)。
面向?qū)ο蟮囊恍┗靖拍詈吞卣?/p>
類(lèi):用來(lái)描述具有相同屬性和方實(shí)例變量:定義在方法中的變量,只作用于當(dāng)前實(shí)例的類(lèi)。繼承:即一個(gè)派生類(lèi)(derivedclass)繼承基類(lèi)(baseclass)的字段和方法,繼承也允許把一個(gè)派生類(lèi)的對(duì)象作為一個(gè)基類(lèi)對(duì)象對(duì)待。實(shí)例化:創(chuàng)建一個(gè)類(lèi)的實(shí)例,類(lèi)的具體對(duì)象。方法:類(lèi)中定義的函數(shù)。對(duì)象:對(duì)象包括兩類(lèi)數(shù)據(jù)成員(類(lèi)變量和實(shí)例變量)和方法,通過(guò)類(lèi)定義的數(shù)據(jù)結(jié)構(gòu)實(shí)例化。
實(shí)例變量:定義在方法中的變量,只作用于當(dāng)前實(shí)例的類(lèi)。6.1類(lèi)的定義與使用
Python中的類(lèi)是一個(gè)抽象的概念,比函數(shù)還要抽象。我們可以把它簡(jiǎn)單看做是數(shù)據(jù)以及由存取、操作這些數(shù)據(jù)的方法所組成的一個(gè)集合。那為什么還要用類(lèi)來(lái)取代函數(shù)呢?6.1類(lèi)的定義與使用
Python中的類(lèi)是一個(gè)抽象的概念
類(lèi)有如下優(yōu)點(diǎn):類(lèi)對(duì)象是多態(tài)的:也就是具有多種形態(tài),這意味著我們可以對(duì)不同的類(lèi)對(duì)象使用同樣的操作方法,而不需要額外編寫(xiě)代碼。類(lèi)的封裝:類(lèi)封裝之后,可以直接調(diào)用類(lèi)的對(duì)象來(lái)操作內(nèi)部的一些類(lèi)方法,不需要讓使用者看到代碼工作的細(xì)節(jié)。類(lèi)的繼承:類(lèi)可以從其它類(lèi)或者基類(lèi)中繼承它們的方法,直接使用。
類(lèi)有如下優(yōu)點(diǎn):類(lèi)對(duì)象是多態(tài)的:也就是具有多種形態(tài),這意味著6.1.1類(lèi)的定義
類(lèi)是對(duì)現(xiàn)實(shí)世界中一些事物的封裝,所有類(lèi)的開(kāi)頭都要包括關(guān)鍵字class,緊接著的是類(lèi)名和冒號(hào),隨后是定義類(lèi)的類(lèi)體代碼。
語(yǔ)法格式如下:
classClassName:
"""documentationstring"""
<statement_1>
<statement_2>
......
<statement-N>
6.1.1類(lèi)的定義
類(lèi)是對(duì)現(xiàn)實(shí)世界中一些事物的封裝,所有object是“所有類(lèi)之父”。如果你的類(lèi)沒(méi)有繼承任何其他父類(lèi),object將作為默認(rèn)的父類(lèi),它位于所有類(lèi)繼承結(jié)構(gòu)的最上層(繼承的概念在本章稍后介紹),定義一個(gè)類(lèi)可以采用下面的方式。object是“所有類(lèi)之父”。如果你的類(lèi)沒(méi)有繼承任何其他父類(lèi)【實(shí)例6-1】類(lèi)的定義。
classpeople:
#定義基本屬性
name=''
age=0
#定義私有屬性,私有屬性在類(lèi)外部無(wú)法直接進(jìn)行訪(fǎng)問(wèn)
__weight=0
#定義構(gòu)造方法
def__init__(self,n,a,w):
=n
self.age=a
self.__weight=w
#定義類(lèi)本身的方法
defspeak(self):
print("%sisspeaking:Iam%dyearsold"%(,self.age))
#類(lèi)調(diào)用
p=people('tom',10,30)
p.speak()
【實(shí)例6-1】類(lèi)的定義。
classpeople:
注意:在上面的例子中,name和age是類(lèi)的公有屬性。__weight使用兩個(gè)下劃線(xiàn)開(kāi)頭,表示聲明該屬性為私有屬性,它不能在類(lèi)的外部被使用或直接訪(fǎng)問(wèn),但可以在類(lèi)內(nèi)部使用self.__weight調(diào)用。注意:在上面的例子中,name和age是類(lèi)的公有屬性。__w【實(shí)例6-2】接上例。
print()
print(p.__weight)
出錯(cuò)的原因在于,在類(lèi)的外部使用了私有屬性。
【實(shí)例6-2】接上例。
print()
prin6.1.2類(lèi)屬性與方法
1.類(lèi)的公有屬性
public_attrs:符合正常的變量命名規(guī)則,開(kāi)頭沒(méi)有下劃線(xiàn),類(lèi)外部可以直接進(jìn)行訪(fǎng)問(wèn)。如上例中的name、age等。2.類(lèi)的私有屬性
__private_attrs:由兩個(gè)下劃線(xiàn)開(kāi)頭,聲明該屬性為私有,不能在類(lèi)的外部被使用或直接訪(fǎng)問(wèn)。在類(lèi)內(nèi)部的方法中使用時(shí)的格式為self.__private_attrs。6.1.2類(lèi)屬性與方法
1.類(lèi)的公有屬性
public_
【實(shí)例6-3】類(lèi)的私有屬性。
classCounter:
__privateCount=1#私有屬性
publicCount=1#公有屬性
defcount(self):
self.__privateCount+=1
self.publicCount+=1
print(self.__privateCount)
counter_1=Counter()
counter_1.count()#打印數(shù)據(jù)
print(counter_1.publicCount)#打印數(shù)據(jù)
print(counter_1.__privateCount)#報(bào)錯(cuò),實(shí)例不能訪(fǎng)問(wèn)私有屬性
出錯(cuò)的原因在于,在類(lèi)的外部使用了私有屬性。
【實(shí)例6-3】類(lèi)的私有屬性。
classCounter:3.類(lèi)的構(gòu)造方法
__init__:叫作構(gòu)造函數(shù)或者構(gòu)造方法,它在生成一個(gè)對(duì)象時(shí)被自動(dòng)調(diào)用。在上文的例子中p=people('tom',10,30)語(yǔ)句就是調(diào)用__init__方法將參數(shù)傳遞給、self.age和self.__weight。4.類(lèi)的公共方法
public_method:在類(lèi)的內(nèi)部,使用def關(guān)鍵字可以為類(lèi)定義一個(gè)方法,與一般函數(shù)定義不同,類(lèi)方法必須包含參數(shù)self,且為第一個(gè)參數(shù)。self在Python里不是關(guān)鍵字,self代表當(dāng)前對(duì)象的地址,類(lèi)似于Java語(yǔ)言中的this。3.類(lèi)的構(gòu)造方法
__init__:叫作構(gòu)造函數(shù)或者構(gòu)造方法
5.類(lèi)的私有方法
__private_method:由兩個(gè)下劃線(xiàn)開(kāi)頭,聲明該方法為私有方法,不能在類(lèi)的外部調(diào)用。在類(lèi)的內(nèi)部調(diào)用時(shí)格式為self.__private_methods。
5.類(lèi)的私有方法
__private_method:由兩個(gè)【實(shí)例6-4】類(lèi)的私有方法。
classSite:
def__init__(self,name,url):
=name#公有屬性
self.__url=url#私有屬性
defprintme(self):
print(‘name:’,)
print(‘url:’,self.__url)
def__printme_1(self):#私有方法
print(‘輸出私有方法’)
defprintme_1(self):#公共方法
print('輸出公共方法')
self.__printme_1()
wz=Site('百度網(wǎng)址','')
wz.printme()#打印數(shù)據(jù)
wz.printme_1()#打印數(shù)據(jù),調(diào)用私有方法__printme_1()
wz.__printme_1()#報(bào)錯(cuò),實(shí)例不能訪(fǎng)問(wèn)私有屬性
【實(shí)例6-4】類(lèi)的私有方法。
classSite:
出錯(cuò)的原因在于,實(shí)例不能訪(fǎng)問(wèn)私有方法。Python面向?qū)ο缶幊虒?zhuān)題培訓(xùn)課件6.單下劃線(xiàn)(_)
以單下劃線(xiàn)開(kāi)始的成員變量叫做保護(hù)變量,意思是只有類(lèi)對(duì)象和子類(lèi)對(duì)象自己能訪(fǎng)問(wèn)到這些變量,簡(jiǎn)單的模塊級(jí)私有化只需要在屬性名前使用一個(gè)單下劃線(xiàn)字符。以單下劃線(xiàn)開(kāi)頭(_singlePrivate)的屬性代表不能直接訪(fǎng)問(wèn)的類(lèi)屬性,需通過(guò)類(lèi)提供的接口進(jìn)行訪(fǎng)問(wèn),這就防止模塊的屬性用“frommymoduleimport*”來(lái)加載,這是嚴(yán)格基于作用域的,所以這同樣適合于函數(shù)。
6.單下劃線(xiàn)(_)
以單下劃線(xiàn)開(kāi)始的成員變量叫做保護(hù)變量,意【實(shí)例6-5】下劃線(xiàn)的使用。
classTest():
def__init__(self):
pass
defpublic(self):
print('這是公共方法')
def_singlePrivate(self):
print('這是單下劃線(xiàn)方法')
def__doublePrivate(self):
print('這是雙下劃線(xiàn)方法')
t=Test()
t.public()#可以調(diào)用
t._singlePrivate()#可以調(diào)用
t.__doublePrivate()#出現(xiàn)錯(cuò)誤
【實(shí)例6-5】下劃線(xiàn)的使用。
classTest():
注意:f._singlePrivate()可以直接訪(fǎng)問(wèn),不過(guò)根據(jù)Python的約定,應(yīng)該將其視作private,而不要在外部使用它們,良好的編程習(xí)慣是不要在外部使用它。同時(shí),根據(jù)Pythondocs的說(shuō)明,_object和__object的作用域限制在本模塊內(nèi)。Python面向?qū)ο缶幊虒?zhuān)題培訓(xùn)課件
7.類(lèi)的專(zhuān)有方法
下面是Python常用的一些專(zhuān)有方法,如表6-1所示。
7.類(lèi)的專(zhuān)有方法
下面是Python常用的一些專(zhuān)有方法,表6-1類(lèi)的專(zhuān)有方法專(zhuān)有方法專(zhuān)有方法說(shuō)明__init__構(gòu)造函數(shù),在生成對(duì)象時(shí)調(diào)用__del__析構(gòu)函數(shù),釋放對(duì)象時(shí)使用__repr__打印,轉(zhuǎn)換__setitem__按照索引賦值__getitem__按照索引獲取值__len__獲得長(zhǎng)度__call__函數(shù)調(diào)用__add__加運(yùn)算__sub__減運(yùn)算__mul__乘運(yùn)算__div__除運(yùn)算__mod__求余運(yùn)算__pow__乘方運(yùn)算表6-1類(lèi)的專(zhuān)有方法專(zhuān)有方法專(zhuān)有方法說(shuō)明__init__構(gòu)【例6-6】__del__和__repr__專(zhuān)有方法的使用。classTest:def__init__(self,name=None):=namedef__del__(self):print("helloworld!")def__repr__(self):return"Study('Jacky')"defsay(self):print()
Test("Tim")#自動(dòng)調(diào)用__del__方法s=Test("Tim")s.say()print(s)#自動(dòng)調(diào)用__repr__方法print(Test("Kitty"))#先自動(dòng)調(diào)用__repr__方法,然后自動(dòng)調(diào)用__del__方法
【例6-6】__del__和__repr__專(zhuān)有方法的使用?!緦?shí)例6-7】__str__專(zhuān)有方法的使用。
classTest:
def__init__(self,number):
self.a=number[0:3]
self.b=number[3:6]
def__str__(self):
return“%s%s”%(self.a,self.b)
deftest():
num=Test(input(“請(qǐng)輸入數(shù)字:\n”))
print("輸入的數(shù)字是:",num)
#執(zhí)行腳本
test()
【實(shí)例6-7】__str__專(zhuān)有方法的使用。
classT6.1.3關(guān)于Python的作用域和命名空間
。
1.作用域與命名空間的解釋作用域是指Python程序可以直接訪(fǎng)問(wèn)到的命名空間?!爸苯釉L(fǎng)問(wèn)”在這里意味著訪(fǎng)問(wèn)命名空間中的命名時(shí)無(wú)需加入附加的修飾符。
命名空間本質(zhì)上是一個(gè)字典,它的鍵就是變量名,它的值就是那些變量的值。Python使用命名空間來(lái)記錄變量的軌跡。6.1.3關(guān)于Python的作用域和命名空間
。
1.作在Python程序中的任何一個(gè)地方,都存在三個(gè)可用的命名空間:(1)每個(gè)函數(shù)都有自已的命名空間(稱(chēng)作局部命名空間),它記錄了函數(shù)的變量,包括函數(shù)的參數(shù)和局部定義的變量。(2)每個(gè)模塊都有自已的命名空間(稱(chēng)作全局命名空間),它記錄了模塊的變量,包括函數(shù)、類(lèi)、其它導(dǎo)入的模塊、模塊級(jí)的變量和常量。(3)每個(gè)模塊都有可訪(fǎng)問(wèn)的內(nèi)置命名空間,它存放著內(nèi)置函數(shù)和異常。在Python程序中的任何一個(gè)地方,都存在三個(gè)可用的命名空間2.命名空間的查找順序(1)局部命名空間——特指當(dāng)前函數(shù)或類(lèi)的方法。如果函數(shù)中定義一個(gè)局部變量x,Python將使用這個(gè)變量,然后停止搜索。(2)全局命名空間——特指當(dāng)前的模塊。如果模塊中定義名為x的變量、函數(shù)或類(lèi),Python將使用這個(gè)變量,然后停止搜索。Python面向?qū)ο缶幊虒?zhuān)題培訓(xùn)課件(3)內(nèi)置命名空間——對(duì)每個(gè)模塊都是全局的,作為最后的嘗試,Python將假設(shè)x是內(nèi)置函數(shù)或變量。(4)如果Python在這些命名空間中都找不到x,它將放棄查找并引發(fā)一個(gè)NameError異常,同時(shí)傳遞“Thereisnovariablenamed'x'”這樣一條信息。(3)內(nèi)置命名空間——對(duì)每個(gè)模塊都是全局的,作為最后的嘗試,當(dāng)函數(shù)被調(diào)用時(shí)創(chuàng)建一個(gè)局部命名空間,我們可以通過(guò)globals()和locals()內(nèi)建函數(shù)判斷某一名字屬于哪個(gè)名稱(chēng)空間。locals()是只讀的,globals()不是。
當(dāng)函數(shù)被調(diào)用時(shí)創(chuàng)建一個(gè)局部命名空間,我們可以通過(guò)global【實(shí)例6-8】locals()函數(shù)示例。
deffoo(arg,a):
x=1
y='abc'
foriinrange(5):
j=2
k=i
print(locals())
#調(diào)用函數(shù)的打印結(jié)果
foo(2,3)
locals()實(shí)際上沒(méi)有返回局部命名空間,它返回的是一個(gè)拷貝。所以對(duì)它進(jìn)行改變對(duì)局部命名空間中的變量值并無(wú)影響。
【實(shí)例6-8】locals()函數(shù)示例。
deffoo(a【實(shí)例6-9】globals()函數(shù)示例。
print("當(dāng)前的全局命名空間:")
var=globals()
print(var)
globals()函數(shù)返回實(shí)際的全局命名空間,而不是一個(gè)拷貝。所以對(duì)globals()函數(shù)所返回的var的任何改動(dòng)都會(huì)直接影響到全局變量。【實(shí)例6-9】globals()函數(shù)示例。
print("當(dāng)3.嵌套函數(shù)命名空間的查找步驟:(1)先在當(dāng)前函數(shù)(嵌套的函數(shù)或lambda匿名函數(shù))的命名空間中搜索。(2)然后在父函數(shù)的命名空間中搜索。(3)接著在模塊命名空間中搜索。(4)最后在內(nèi)建函數(shù)的命名空間中搜索。下面舉例說(shuō)明。3.嵌套函數(shù)命名空間的查找步驟:
【實(shí)例6-10】嵌套函數(shù)命名空間示例。
address="地址:"
deffunc_country(country):
deffunc_part(part):
city="天津"#覆蓋父函數(shù)的part變量
print(address+country+city+part)
city="北京"#初始化city變量
#調(diào)用內(nèi)部函數(shù)
func_part("西青")#初始化part變量
#調(diào)用外部函數(shù)
func_country("中國(guó)")#初始化country變量
以上實(shí)例中,address在全局命名空間中,country在父函數(shù)的命名空間中,city、part在子函數(shù)的命名空間中。
【實(shí)例6-10】嵌套函數(shù)命名空間示例。
address=6.2Python類(lèi)與對(duì)象
6.2.1類(lèi)對(duì)象類(lèi)對(duì)象支持兩種操作:屬性引用和實(shí)例化。
類(lèi)對(duì)象的屬性引用和Python中所有屬性的引用一樣,都使用標(biāo)準(zhǔn)的語(yǔ)法:。類(lèi)對(duì)象創(chuàng)建之后,類(lèi)命名空間中所有的命名都是有效屬性名。
6.2Python類(lèi)與對(duì)象
6.2.1類(lèi)對(duì)象在Python中,方法定義在類(lèi)的定義中,但只能被類(lèi)對(duì)象的實(shí)例所調(diào)用。調(diào)用一個(gè)方法的途徑分三步:1.定義類(lèi)和類(lèi)中的方法。2.創(chuàng)建一個(gè)或若干個(gè)實(shí)例,即將類(lèi)實(shí)例化。3.用所創(chuàng)建的實(shí)例調(diào)用方法。在Python中,方法定義在類(lèi)的定義中,但只能被類(lèi)對(duì)象的實(shí)例【實(shí)例6-11】類(lèi)的定義與實(shí)例化。
classMyClass:
"""一個(gè)簡(jiǎn)單的類(lèi)實(shí)例"""
i=12
deff(self):
return'helloworld'
#實(shí)例化類(lèi)
MyClass=MyClass()
#訪(fǎng)問(wèn)類(lèi)的屬性和方法
print("MyClass類(lèi)的屬性i為:",MyClass.i)
print("MyClass類(lèi)的方法f輸出為:",MyClass.f())
【實(shí)例6-11】類(lèi)的定義與實(shí)例化。
classMyClas本例中,MyClass.i和MyClass.f()是有效的屬性引用,分別返回一個(gè)整數(shù)和一個(gè)方法對(duì)象。也可以對(duì)類(lèi)屬性賦值,即可以通過(guò)給MyClass.i賦值來(lái)修改它。如:
MyClass.i=56
print("修改后MyClass類(lèi)的屬性i為:",MyClass.i)
本例中,MyClass.i和MyClass.f()是有效的屬類(lèi)的實(shí)例化使用函數(shù)符號(hào),只要將類(lèi)對(duì)象看作是一個(gè)返回新的類(lèi)實(shí)例的無(wú)參數(shù)函數(shù)即可。例如(假設(shè)沿用前面的類(lèi)):
MyClass=MyClass()
該語(yǔ)句創(chuàng)建了一個(gè)新的類(lèi)實(shí)例(對(duì)象),并將該對(duì)象賦給局部變量MyClass。通過(guò)實(shí)例化操作(“調(diào)用”一個(gè)類(lèi)對(duì)象)來(lái)創(chuàng)建一個(gè)空的對(duì)象時(shí),通常會(huì)把這個(gè)新建的實(shí)例賦給一個(gè)變量。賦值在語(yǔ)法上不是必須的,但如果不把這個(gè)實(shí)例保存到一個(gè)變量中,它就沒(méi)有用,會(huì)被垃圾收集器自動(dòng)回收,因?yàn)闆](méi)有任何引用指向這個(gè)實(shí)例。
類(lèi)的實(shí)例化使用函數(shù)符號(hào),只要將類(lèi)對(duì)象看作是一個(gè)返回新的類(lèi)實(shí)例很多類(lèi)都傾向于創(chuàng)建一個(gè)有初始化狀態(tài)的對(duì)象。因此類(lèi)可能會(huì)定義一個(gè)名為_(kāi)_init__()的特殊方法(構(gòu)造方法),像下面這樣:
def__init__(self):
self.data=[]很多類(lèi)都傾向于創(chuàng)建一個(gè)有初始化狀態(tài)的對(duì)象。因此類(lèi)可能會(huì)定義一當(dāng)類(lèi)被調(diào)用時(shí),實(shí)例化的第一步就是創(chuàng)建實(shí)例對(duì)象,一旦對(duì)象創(chuàng)建,Python就檢查是否已經(jīng)實(shí)現(xiàn)__init__()方法。默認(rèn)情況下,如果沒(méi)有定義(或覆蓋)特殊方法__init__(),對(duì)實(shí)例不會(huì)施加任何特別的操作。任何所需的特定操作,都需要程序員實(shí)現(xiàn)__init__()方法,覆蓋它的默認(rèn)行為。所以在下例中,可以這樣創(chuàng)建一個(gè)新的實(shí)例:
MyClass_1=MyClass()__init__()方法可以有參數(shù)。事實(shí)上,正是通過(guò)__init__()方法,參數(shù)被傳遞到類(lèi)的實(shí)例上。
當(dāng)類(lèi)被調(diào)用時(shí),實(shí)例化的第一步就是創(chuàng)建實(shí)例對(duì)象,一旦對(duì)象創(chuàng)建,【實(shí)例6-12】使用帶參數(shù)的__init__()方法初始化。
classComplex:
def__init__(self,realpart,imagpart):
self.r=realpart
self.i=imagpart
x=Complex(2.4,-4.6)
print(x.r,x.i)
【實(shí)例6-12】使用帶參數(shù)的__init__()方法初始化。
6.2.2類(lèi)的屬性有兩種有效的屬性名:數(shù)據(jù)屬性和特殊類(lèi)屬性。1.數(shù)據(jù)屬性
這相當(dāng)于Smalltalk中的“實(shí)例變量”或C++中的“數(shù)據(jù)成員”。和局部變量一樣,數(shù)據(jù)屬性不需要聲明,第一次使用時(shí)它們就會(huì)生成。
6.2.2類(lèi)的屬性【實(shí)例6-13】數(shù)據(jù)屬性說(shuō)明。
classfoo(object):
f=100
print(foo.f)
print(foo.f+1)
【實(shí)例6-13】數(shù)據(jù)屬性說(shuō)明。
classfoo(obje2.特殊類(lèi)屬性
對(duì)任何類(lèi)foo,類(lèi)foo的部分特殊屬性如表6-2所示。
2.特殊類(lèi)屬性
對(duì)任何類(lèi)foo,類(lèi)foo的部分特殊屬性如表6表6-2特殊類(lèi)屬性類(lèi)屬性類(lèi)屬性說(shuō)明foo.__name__類(lèi)foo的名字(字符串)foo.__doc__類(lèi)foo的文檔字符串foo.__bases__類(lèi)foo的所有父類(lèi)構(gòu)成的元組foo.__dict__類(lèi)foo的屬性foo.__module__類(lèi)foo定義所在的模塊foo.__class__實(shí)例foo對(duì)應(yīng)的類(lèi)表6-2特殊類(lèi)屬
【實(shí)例6-14】類(lèi)屬性說(shuō)明。
classMyClass(object):
"""MyClass類(lèi)定義"""
myVer='3.4'
defshowMyVer(self):
print(MyClass.myVer)
print(dir(MyClass))
print(MyClass.__dict__)根據(jù)上面定義的類(lèi),我們使用dir()和特殊類(lèi)屬性__dict__來(lái)查看一下類(lèi)的屬性:
【實(shí)例6-14】類(lèi)屬性說(shuō)明。
classMyClass(從上面可以看到,dir()返回的僅是對(duì)象的屬性的一個(gè)名字列表,而__dict__返回的是一個(gè)字典,它的鍵是屬性名,值是相應(yīng)的屬性對(duì)象的數(shù)據(jù)值。結(jié)果還顯示MyClass類(lèi)中兩個(gè)熟悉的屬性,showMyVer和myVer,以及一些新的屬性。Python面向?qū)ο缶幊虒?zhuān)題培訓(xùn)課件6.2.3實(shí)例屬性
內(nèi)建函數(shù)dir()可以顯示類(lèi)屬性,同樣還可以打印所有實(shí)例屬性?!緦?shí)例6-15】實(shí)例屬性說(shuō)明。
classfoo(object):
pass
foo_1=foo()
print(dir(foo_1))
6.2.3實(shí)例屬性
內(nèi)建函數(shù)dir()可以顯示類(lèi)屬性,同樣還
實(shí)例有兩個(gè)特殊屬性,如表6-3所示。
表6-3特殊實(shí)例屬性實(shí)例屬性實(shí)例屬性說(shuō)明foo_1.__class__實(shí)例化foo_1的類(lèi)foo_1.__dict__foo_1的屬性
實(shí)例有兩個(gè)特殊屬性,如表6-3所示。
現(xiàn)在使用類(lèi)foo及其實(shí)例foo_1來(lái)看看這些特殊實(shí)例屬性?!緦?shí)例6-16】查看實(shí)例屬性__dict__和__class__。
classfoo(object):
pass
foo_1=foo()
print(foo_1.__dict__)
print(foo_1.__class__)
現(xiàn)在使用類(lèi)foo及其實(shí)例foo_1來(lái)看看這些特殊實(shí)例屬性。foo_1現(xiàn)在還沒(méi)有數(shù)據(jù)屬性,但我們可以添加一些再來(lái)檢查_(kāi)_dict__屬性?!緦?shí)例6-17】查看類(lèi)的數(shù)據(jù)屬性。
classfoo(object):
pass
foo_1=foo()
foo_1.f=100
foo_1.b="hello"
print(foo_1.__dict__)
print(foo_1.__class__)
foo_1現(xiàn)在還沒(méi)有數(shù)據(jù)屬性,但我們可以添加一些再來(lái)檢查_(kāi)_注意:__dict__屬性由一個(gè)字典組成,包含一個(gè)實(shí)例的所有屬性。鍵是屬性名,值是屬性相應(yīng)的數(shù)據(jù)值。字典中僅有實(shí)例屬性,沒(méi)有類(lèi)屬性或特殊屬性。
Python面向?qū)ο缶幊虒?zhuān)題培訓(xùn)課件
6.2.4一些說(shuō)明同名的數(shù)據(jù)屬性會(huì)覆蓋方法屬性,最好以某種命名約定來(lái)避免沖突,因?yàn)檫@在大型程序中可能會(huì)導(dǎo)致難以發(fā)現(xiàn)的bug??蛇x的約定包括:(1)類(lèi)名由大寫(xiě)字母書(shū)寫(xiě)。(2)方法的首字母大寫(xiě)。(3)數(shù)據(jù)屬性名前綴小寫(xiě)(可能只是一個(gè)下劃線(xiàn))。(4)方法使用動(dòng)詞而數(shù)據(jù)屬性使用名詞。
6.2.4一些說(shuō)明數(shù)據(jù)屬性可以由方法引用,也可以由普通用戶(hù)調(diào)用。程序員應(yīng)該小心使用數(shù)據(jù)屬性,程序員可能會(huì)因?yàn)殡S意修改數(shù)據(jù)屬性而破壞本來(lái)由方法維護(hù)的數(shù)據(jù)一致性。需要注意的是,程序員只要注意避免命名沖突,就可以隨意向?qū)嵗刑砑訑?shù)據(jù)屬性而不會(huì)影響方法的有效性--再次強(qiáng)調(diào),命名約定可以省去很多麻煩。
數(shù)據(jù)屬性可以由方法引用,也可以由普通用戶(hù)調(diào)用。對(duì)Python而言,self絕對(duì)沒(méi)有任何特殊含義。通過(guò)使用self參數(shù)的方法屬性,方法可以調(diào)用其它的方法。【實(shí)例6-18】self參數(shù)的使用。
classBag:
def__init__(self):
self.data=[]
defadd(self,x):
self.data.append(x)
print(self.data)
defaddtwice(self,x):
self.add(x)
print(self.data)
bag_1=Bag()
bag_1.add(5)
bag_1.addtwice(6)
對(duì)Python而言,self絕對(duì)沒(méi)有任何特殊含義。通過(guò)使用s6.3繼承
6.3.1單繼承Python同樣支持類(lèi)的繼承,如果一種語(yǔ)言不支持繼承,類(lèi)就沒(méi)有什么意義,類(lèi)還允許派生,用戶(hù)可以創(chuàng)建一個(gè)子類(lèi),它也是類(lèi),而且繼承父類(lèi)所有的特征和屬性。派生類(lèi)的定義如下所示:
classDerivedClassName(BaseClassName):
<statement-1>
……
<statement-N>命名BaseClassName(示例中的基類(lèi)名)必須與派生類(lèi)定義在一個(gè)作用域內(nèi)?;?lèi)可以定義在另一個(gè)模塊中,這一點(diǎn)非常有用,格式如下:
classDerivedClassName(modname.BaseClassName):
6.3繼承
6.3.1單繼承【實(shí)例6-19】單繼承實(shí)例。
#類(lèi)定義
classpeople:
#定義基本屬性
name=''
age=0
#定義私有屬性,私有屬性在類(lèi)外部無(wú)法直接進(jìn)行訪(fǎng)問(wèn)
__weight=0
#定義構(gòu)造方法
def__init__(self,n,a,w):
=n
self.age=a
self.__weight=w
defspeak(self):
print("%ssays:Iam%dyearsold"%(,self.age))
【實(shí)例6-19】單繼承實(shí)例。
#類(lèi)定義
classpeop#單繼承
classstudent(people):
grade=''
def__init__(self,n,a,w,g):
#調(diào)用父類(lèi)的構(gòu)造函數(shù)
people.__init__(self,n,a,w)
self.grade=g
#重寫(xiě)父類(lèi)的方法
defspeak(self):
print("%ssays:Iam%dyearsold,IaminGrade%d."%(,self.age,self.grade))s=student(‘Tom’,10,90,3)
s.speak()
#單繼承
classstudent(people):
提示:派生類(lèi)定義的執(zhí)行過(guò)程和基類(lèi)是一樣的。構(gòu)造派生類(lèi)對(duì)象時(shí),就繼承基類(lèi)。這在解析屬性引用的時(shí)候尤其有用:如果在類(lèi)中找不到請(qǐng)求調(diào)用的屬性,就搜索基類(lèi)。如果基類(lèi)是由別的類(lèi)派生而來(lái),這個(gè)規(guī)則會(huì)遞歸地應(yīng)用上去。
提示:6.3.2多繼承Python同樣有限地支持多繼承形式,多繼承的類(lèi)定義的一般形式如下:
classDerivedClassName(Base1,Base2,Base3):
<statement-1>
……
<statement-N>這里唯一需要解釋的語(yǔ)義是解析類(lèi)屬性的規(guī)則。順序是深度優(yōu)先,從左到右。因此,如果在DerivedClassName(示例中的派生類(lèi))中沒(méi)有找到某個(gè)屬性,就會(huì)搜索Base1,然后遞歸地搜索其基類(lèi),如果最終沒(méi)有找到,就搜索Base2,依此類(lèi)推。深度優(yōu)先不區(qū)分屬性繼承自基類(lèi)還是直接定義。
6.3.2多繼承【實(shí)例6-20】多繼承實(shí)例。
#類(lèi)定義
classpeople:
#定義基本屬性
name=''
age=0
#定義私有屬性,私有屬性在類(lèi)外部無(wú)法直接進(jìn)行訪(fǎng)問(wèn)
__weight=0
#定義構(gòu)造方法
def__init__(self,n,a,w):
=n
self.age=a
self.__weight=w
defspeak(self):
print("%ssays:Iam%dyearsold"%(,self.age))
【實(shí)例6-20】多繼承實(shí)例。
#類(lèi)定義
classpeop#單繼承示例
classstudent(people):
grade=‘’
def__init__(self,n,a,w,g):
#調(diào)用父類(lèi)的構(gòu)函
people.__init__(self,n,a,w)
self.grade=g
#覆寫(xiě)父類(lèi)的方法
defspeak(self):
print(“%ssays:Iam%dyearsold,IaminGrade%d.”
%(,self.age,self.grade))
Python面向?qū)ο缶幊虒?zhuān)題培訓(xùn)課件#另一個(gè)類(lèi),多重繼承之前的準(zhǔn)備
classspeaker():
topic=‘’
name=‘’
def__init__(self,n,t):
=n
self.topic=t
defspeak(self):
print(“Iam%s,Iamaspeaker,mytopicis%s”%(,self.topic))
#多重繼承
classsample(speaker,student):
a=''
def__init__(self,n,a,w,g,t):
student.__init__(self,n,a,w,g)
speaker.__init__(self,n,t)
test_1=sample("Tom",12,90,3,"OneWorldOneDream")
test_1.speak()#方法名同,默認(rèn)調(diào)用的是在括號(hào)中排前的父類(lèi)的方法,即speaker類(lèi)里面的方法。
#另一個(gè)類(lèi),多重繼承之前的準(zhǔn)備
classspeaker(
注意:不加限制地使用多繼承會(huì)帶來(lái)維護(hù)上的噩夢(mèng),因?yàn)镻ython中只依靠約定來(lái)避免命名沖突。多繼承一個(gè)很有名的問(wèn)題是派生繼承的兩個(gè)基類(lèi)都是從同一個(gè)基類(lèi)繼承而來(lái)。目前還不清楚這在語(yǔ)義上有什么意義,然而這會(huì)造成意料之外的后果。
注意:不加限制地使用多繼承會(huì)帶來(lái)維護(hù)上的噩夢(mèng),因?yàn)镻yth6.3.3方法重寫(xiě)
如果父類(lèi)方法的功能不能滿(mǎn)足需求,可以在子類(lèi)里面重寫(xiě)父類(lèi)的方法?!緦?shí)例6-21】方法重寫(xiě)。
classParent:#定義父類(lèi)
defmyMethod(self):
print('調(diào)用父類(lèi)方法')
classChild(Parent):#定義子類(lèi)
defmyMethod(self):
print('調(diào)用子類(lèi)方法')
Child_1=Child()#子類(lèi)實(shí)例
Child_1.myMethod()#子類(lèi)調(diào)用重寫(xiě)方法
6.3.3方法重寫(xiě)
如果父類(lèi)方法的功能不能滿(mǎn)足需求,可以在6.4項(xiàng)目實(shí)例類(lèi)與繼承實(shí)例
本例定義三個(gè)類(lèi),分別為Member類(lèi)、Student類(lèi)、Teacher類(lèi),Student類(lèi)和Teacher類(lèi)分別繼承Member類(lèi),并且定義自己的tell()方法,其中使用了Member類(lèi)的方法。
6.4項(xiàng)目實(shí)例classMember:
def__init__(self,name,age):
=name
self.age=age
deftell(self):
print(‘Name:%s,Age:%d’%(,self.age))
classStudent(Member):
def__init__(self,name,age,marks):
Member.__init__(self,name,age)
self.marks=marks
deftell(self):
Member.tell(self)
print(‘Marks:%d’%self.marks)
classTeacher(Member):
def__init__(self,name,age,salary):
Member.__init__(self,name,age)
self.salary=salary
deftell(self):
Member.tell(self)
print('Salary:%d'%self.salary)
classMember:
def__initStu_1=Student('Tom',21,77)
Stu_2=Student('Tim',19,87)
Stu_3=Student('Tam',22,93)
Tea_1=Teacher('Mrs.Wang',42,5200)
Tea_2=Teacher('Mr.Zhang',39,4800)
members=[Stu_1,Stu_2,Stu_3,Tea_1,Tea_2]
formeminmembers:
mem.tell()
Stu_1=Student('Tom',21,77)6.5本章小結(jié)本章對(duì)面向?qū)ο蠹夹g(shù)進(jìn)行了簡(jiǎn)單介紹,重點(diǎn)內(nèi)容如下:1.類(lèi)的定義與使用首先介紹類(lèi)、類(lèi)變量、數(shù)據(jù)成員、方法重寫(xiě)、實(shí)例變量、繼承、實(shí)例化、方法、對(duì)象等概念;其次介紹類(lèi)的定義與使用,包括使用類(lèi)的優(yōu)點(diǎn)、類(lèi)定義的語(yǔ)法格式、類(lèi)的屬性與方法以及Python常用的專(zhuān)有方法。6.5本章小結(jié)本章對(duì)面向?qū)ο蠹夹g(shù)進(jìn)行了簡(jiǎn)單介紹,重點(diǎn)內(nèi)容如2.類(lèi)與對(duì)象
首先介紹類(lèi)對(duì)象支持的兩種操作:屬性引用和實(shí)例化;其次介紹類(lèi)的屬性:兩種有效的屬性名、數(shù)據(jù)屬性和特殊類(lèi)屬性,包括__name__、__doc__等;再次介紹實(shí)例屬性:內(nèi)建函數(shù)dir()的使用、兩個(gè)特殊屬性__class__和__dict__等;最后介紹命名約定,并對(duì)self的使用情況進(jìn)行舉例說(shuō)明。
2.類(lèi)與對(duì)象
首先介紹類(lèi)對(duì)象支持的兩種操作:屬性引用和實(shí)例化3.類(lèi)的繼承
首先介紹了單繼承和多繼承的概念,并分別舉例說(shuō)明;其次介紹了方法重寫(xiě)。4.實(shí)例項(xiàng)目
類(lèi)的繼承、方法重寫(xiě)。3.類(lèi)的繼承
首先介紹了單繼承和多繼承的概念,并分別舉例說(shuō)明本章結(jié)束謝謝Python面向?qū)ο缶幊虒?zhuān)題培訓(xùn)課件Python面向?qū)ο缶幊蘌ython面向?qū)ο缶幊堂嫦驅(qū)ο蟮囊恍┗靖拍詈吞卣?/p>
類(lèi):用來(lái)描述具有相同屬性和方法的對(duì)象的集合,它定義該集合中每個(gè)對(duì)象所共有的屬性和方法,對(duì)象是類(lèi)的實(shí)例。類(lèi)變量:類(lèi)變量在整個(gè)實(shí)例化的對(duì)象中是公用的,類(lèi)變量定義在類(lèi)中且在函數(shù)體之外,類(lèi)變量通常不作為實(shí)例變量使用。數(shù)據(jù)成員:類(lèi)變量或者實(shí)例變量用于處理類(lèi)及其實(shí)例對(duì)象的相關(guān)數(shù)據(jù)。方法重寫(xiě):如果從父類(lèi)繼承的方法不能滿(mǎn)足子類(lèi)的需求,可以對(duì)其進(jìn)行改寫(xiě),這個(gè)過(guò)程叫方法的覆蓋(override)。
面向?qū)ο蟮囊恍┗靖拍詈吞卣?/p>
類(lèi):用來(lái)描述具有相同屬性和方實(shí)例變量:定義在方法中的變量,只作用于當(dāng)前實(shí)例的類(lèi)。繼承:即一個(gè)派生類(lèi)(derivedclass)繼承基類(lèi)(baseclass)的字段和方法,繼承也允許把一個(gè)派生類(lèi)的對(duì)象作為一個(gè)基類(lèi)對(duì)象對(duì)待。實(shí)例化:創(chuàng)建一個(gè)類(lèi)的實(shí)例,類(lèi)的具體對(duì)象。方法:類(lèi)中定義的函數(shù)。對(duì)象:對(duì)象包括兩類(lèi)數(shù)據(jù)成員(類(lèi)變量和實(shí)例變量)和方法,通過(guò)類(lèi)定義的數(shù)據(jù)結(jié)構(gòu)實(shí)例化。
實(shí)例變量:定義在方法中的變量,只作用于當(dāng)前實(shí)例的類(lèi)。6.1類(lèi)的定義與使用
Python中的類(lèi)是一個(gè)抽象的概念,比函數(shù)還要抽象。我們可以把它簡(jiǎn)單看做是數(shù)據(jù)以及由存取、操作這些數(shù)據(jù)的方法所組成的一個(gè)集合。那為什么還要用類(lèi)來(lái)取代函數(shù)呢?6.1類(lèi)的定義與使用
Python中的類(lèi)是一個(gè)抽象的概念
類(lèi)有如下優(yōu)點(diǎn):類(lèi)對(duì)象是多態(tài)的:也就是具有多種形態(tài),這意味著我們可以對(duì)不同的類(lèi)對(duì)象使用同樣的操作方法,而不需要額外編寫(xiě)代碼。類(lèi)的封裝:類(lèi)封裝之后,可以直接調(diào)用類(lèi)的對(duì)象來(lái)操作內(nèi)部的一些類(lèi)方法,不需要讓使用者看到代碼工作的細(xì)節(jié)。類(lèi)的繼承:類(lèi)可以從其它類(lèi)或者基類(lèi)中繼承它們的方法,直接使用。
類(lèi)有如下優(yōu)點(diǎn):類(lèi)對(duì)象是多態(tài)的:也就是具有多種形態(tài),這意味著6.1.1類(lèi)的定義
類(lèi)是對(duì)現(xiàn)實(shí)世界中一些事物的封裝,所有類(lèi)的開(kāi)頭都要包括關(guān)鍵字class,緊接著的是類(lèi)名和冒號(hào),隨后是定義類(lèi)的類(lèi)體代碼。
語(yǔ)法格式如下:
classClassName:
"""documentationstring"""
<statement_1>
<statement_2>
......
<statement-N>
6.1.1類(lèi)的定義
類(lèi)是對(duì)現(xiàn)實(shí)世界中一些事物的封裝,所有object是“所有類(lèi)之父”。如果你的類(lèi)沒(méi)有繼承任何其他父類(lèi),object將作為默認(rèn)的父類(lèi),它位于所有類(lèi)繼承結(jié)構(gòu)的最上層(繼承的概念在本章稍后介紹),定義一個(gè)類(lèi)可以采用下面的方式。object是“所有類(lèi)之父”。如果你的類(lèi)沒(méi)有繼承任何其他父類(lèi)【實(shí)例6-1】類(lèi)的定義。
classpeople:
#定義基本屬性
name=''
age=0
#定義私有屬性,私有屬性在類(lèi)外部無(wú)法直接進(jìn)行訪(fǎng)問(wèn)
__weight=0
#定義構(gòu)造方法
def__init__(self,n,a,w):
=n
self.age=a
self.__weight=w
#定義類(lèi)本身的方法
defspeak(self):
print("%sisspeaking:Iam%dyearsold"%(,self.age))
#類(lèi)調(diào)用
p=people('tom',10,30)
p.speak()
【實(shí)例6-1】類(lèi)的定義。
classpeople:
注意:在上面的例子中,name和age是類(lèi)的公有屬性。__weight使用兩個(gè)下劃線(xiàn)開(kāi)頭,表示聲明該屬性為私有屬性,它不能在類(lèi)的外部被使用或直接訪(fǎng)問(wèn),但可以在類(lèi)內(nèi)部使用self.__weight調(diào)用。注意:在上面的例子中,name和age是類(lèi)的公有屬性。__w【實(shí)例6-2】接上例。
print()
print(p.__weight)
出錯(cuò)的原因在于,在類(lèi)的外部使用了私有屬性。
【實(shí)例6-2】接上例。
print()
prin6.1.2類(lèi)屬性與方法
1.類(lèi)的公有屬性
public_attrs:符合正常的變量命名規(guī)則,開(kāi)頭沒(méi)有下劃線(xiàn),類(lèi)外部可以直接進(jìn)行訪(fǎng)問(wèn)。如上例中的name、age等。2.類(lèi)的私有屬性
__private_attrs:由兩個(gè)下劃線(xiàn)開(kāi)頭,聲明該屬性為私有,不能在類(lèi)的外部被使用或直接訪(fǎng)問(wèn)。在類(lèi)內(nèi)部的方法中使用時(shí)的格式為self.__private_attrs。6.1.2類(lèi)屬性與方法
1.類(lèi)的公有屬性
public_
【實(shí)例6-3】類(lèi)的私有屬性。
classCounter:
__privateCount=1#私有屬性
publicCount=1#公有屬性
defcount(self):
self.__privateCount+=1
self.publicCount+=1
print(self.__privateCount)
counter_1=Counter()
counter_1.count()#打印數(shù)據(jù)
print(counter_1.publicCount)#打印數(shù)據(jù)
print(counter_1.__privateCount)#報(bào)錯(cuò),實(shí)例不能訪(fǎng)問(wèn)私有屬性
出錯(cuò)的原因在于,在類(lèi)的外部使用了私有屬性。
【實(shí)例6-3】類(lèi)的私有屬性。
classCounter:3.類(lèi)的構(gòu)造方法
__init__:叫作構(gòu)造函數(shù)或者構(gòu)造方法,它在生成一個(gè)對(duì)象時(shí)被自動(dòng)調(diào)用。在上文的例子中p=people('tom',10,30)語(yǔ)句就是調(diào)用__init__方法將參數(shù)傳遞給、self.age和self.__weight。4.類(lèi)的公共方法
public_method:在類(lèi)的內(nèi)部,使用def關(guān)鍵字可以為類(lèi)定義一個(gè)方法,與一般函數(shù)定義不同,類(lèi)方法必須包含參數(shù)self,且為第一個(gè)參數(shù)。self在Python里不是關(guān)鍵字,self代表當(dāng)前對(duì)象的地址,類(lèi)似于Java語(yǔ)言中的this。3.類(lèi)的構(gòu)造方法
__init__:叫作構(gòu)造函數(shù)或者構(gòu)造方法
5.類(lèi)的私有方法
__private_method:由兩個(gè)下劃線(xiàn)開(kāi)頭,聲明該方法為私有方法,不能在類(lèi)的外部調(diào)用。在類(lèi)的內(nèi)部調(diào)用時(shí)格式為self.__private_methods。
5.類(lèi)的私有方法
__private_method:由兩個(gè)【實(shí)例6-4】類(lèi)的私有方法。
classSite:
def__init__(self,name,url):
=name#公有屬性
self.__url=url#私有屬性
defprintme(self):
print(‘name:’,)
print(‘url:’,self.__url)
def__printme_1(self):#私有方法
print(‘輸出私有方法’)
defprintme_1(self):#公共方法
print('輸出公共方法')
self.__printme_1()
wz=Site('百度網(wǎng)址','')
wz.printme()#打印數(shù)據(jù)
wz.printme_1()#打印數(shù)據(jù),調(diào)用私有方法__printme_1()
wz.__printme_1()#報(bào)錯(cuò),實(shí)例不能訪(fǎng)問(wèn)私有屬性
【實(shí)例6-4】類(lèi)的私有方法。
classSite:
出錯(cuò)的原因在于,實(shí)例不能訪(fǎng)問(wèn)私有方法。Python面向?qū)ο缶幊虒?zhuān)題培訓(xùn)課件6.單下劃線(xiàn)(_)
以單下劃線(xiàn)開(kāi)始的成員變量叫做保護(hù)變量,意思是只有類(lèi)對(duì)象和子類(lèi)對(duì)象自己能訪(fǎng)問(wèn)到這些變量,簡(jiǎn)單的模塊級(jí)私有化只需要在屬性名前使用一個(gè)單下劃線(xiàn)字符。以單下劃線(xiàn)開(kāi)頭(_singlePrivate)的屬性代表不能直接訪(fǎng)問(wèn)的類(lèi)屬性,需通過(guò)類(lèi)提供的接口進(jìn)行訪(fǎng)問(wèn),這就防止模塊的屬性用“frommymoduleimport*”來(lái)加載,這是嚴(yán)格基于作用域的,所以這同樣適合于函數(shù)。
6.單下劃線(xiàn)(_)
以單下劃線(xiàn)開(kāi)始的成員變量叫做保護(hù)變量,意【實(shí)例6-5】下劃線(xiàn)的使用。
classTest():
def__init__(self):
pass
defpublic(self):
print('這是公共方法')
def_singlePrivate(self):
print('這是單下劃線(xiàn)方法')
def__doublePrivate(self):
print('這是雙下劃線(xiàn)方法')
t=Test()
t.public()#可以調(diào)用
t._singlePrivate()#可以調(diào)用
t.__doublePrivate()#出現(xiàn)錯(cuò)誤
【實(shí)例6-5】下劃線(xiàn)的使用。
classTest():
注意:f._singlePrivate()可以直接訪(fǎng)問(wèn),不過(guò)根據(jù)Python的約定,應(yīng)該將其視作private,而不要在外部使用它們,良好的編程習(xí)慣是不要在外部使用它。同時(shí),根據(jù)Pythondocs的說(shuō)明,_object和__object的作用域限制在本模塊內(nèi)。Python面向?qū)ο缶幊虒?zhuān)題培訓(xùn)課件
7.類(lèi)的專(zhuān)有方法
下面是Python常用的一些專(zhuān)有方法,如表6-1所示。
7.類(lèi)的專(zhuān)有方法
下面是Python常用的一些專(zhuān)有方法,表6-1類(lèi)的專(zhuān)有方法專(zhuān)有方法專(zhuān)有方法說(shuō)明__init__構(gòu)造函數(shù),在生成對(duì)象時(shí)調(diào)用__del__析構(gòu)函數(shù),釋放對(duì)象時(shí)使用__repr__打印,轉(zhuǎn)換__setitem__按照索引賦值__getitem__按照索引獲取值__len__獲得長(zhǎng)度__call__函數(shù)調(diào)用__add__加運(yùn)算__sub__減運(yùn)算__mul__乘運(yùn)算__div__除運(yùn)算__mod__求余運(yùn)算__pow__乘方運(yùn)算表6-1類(lèi)的專(zhuān)有方法專(zhuān)有方法專(zhuān)有方法說(shuō)明__init__構(gòu)【例6-6】__del__和__repr__專(zhuān)有方法的使用。classTest:def__init__(self,name=None):=namedef__del__(self):print("helloworld!")def__repr__(self):return"Study('Jacky')"defsay(self):print()
Test("Tim")#自動(dòng)調(diào)用__del__方法s=Test("Tim")s.say()print(s)#自動(dòng)調(diào)用__repr__方法print(Test("Kitty"))#先自動(dòng)調(diào)用__repr__方法,然后自動(dòng)調(diào)用__del__方法
【例6-6】__del__和__repr__專(zhuān)有方法的使用?!緦?shí)例6-7】__str__專(zhuān)有方法的使用。
classTest:
def__init__(self,number):
self.a=number[0:3]
self.b=number[3:6]
def__str__(self):
return“%s%s”%(self.a,self.b)
deftest():
num=Test(input(“請(qǐng)輸入數(shù)字:\n”))
print("輸入的數(shù)字是:",num)
#執(zhí)行腳本
test()
【實(shí)例6-7】__str__專(zhuān)有方法的使用。
classT6.1.3關(guān)于Python的作用域和命名空間
。
1.作用域與命名空間的解釋作用域是指Python程序可以直接訪(fǎng)問(wèn)到的命名空間?!爸苯釉L(fǎng)問(wèn)”在這里意味著訪(fǎng)問(wèn)命名空間中的命名時(shí)無(wú)需加入附加的修飾符。
命名空間本質(zhì)上是一個(gè)字典,它的鍵就是變量名,它的值就是那些變量的值。Python使用命名空間來(lái)記錄變量的軌跡。6.1.3關(guān)于Python的作用域和命名空間
。
1.作在Python程序中的任何一個(gè)地方,都存在三個(gè)可用的命名空間:(1)每個(gè)函數(shù)都有自已的命名空間(稱(chēng)作局部命名空間),它記錄了函數(shù)的變量,包括函數(shù)的參數(shù)和局部定義的變量。(2)每個(gè)模塊都有自已的命名空間(稱(chēng)作全局命名空間),它記錄了模塊的變量,包括函數(shù)、類(lèi)、其它導(dǎo)入的模塊、模塊級(jí)的變量和常量。(3)每個(gè)模塊都有可訪(fǎng)問(wèn)的內(nèi)置命名空間,它存放著內(nèi)置函數(shù)和異常。在Python程序中的任何一個(gè)地方,都存在三個(gè)可用的命名空間2.命名空間的查找順序(1)局部命名空間——特指當(dāng)前函數(shù)或類(lèi)的方法。如果函數(shù)中定義一個(gè)局部變量x,Python將使用這個(gè)變量,然后停止搜索。(2)全局命名空間——特指當(dāng)前的模塊。如果模塊中定義名為x的變量、函數(shù)或類(lèi),Python將使用這個(gè)變量,然后停止搜索。Python面向?qū)ο缶幊虒?zhuān)題培訓(xùn)課件(3)內(nèi)置命名空間——對(duì)每個(gè)模塊都是全局的,作為最后的嘗試,Python將假設(shè)x是內(nèi)置函數(shù)或變量。(4)如果Python在這些命名空間中都找不到x,它將放棄查找并引發(fā)一個(gè)NameError異常,同時(shí)傳遞“Thereisnovariablenamed'x'”這樣一條信息。(3)內(nèi)置命名空間——對(duì)每個(gè)模塊都是全局的,作為最后的嘗試,當(dāng)函數(shù)被調(diào)用時(shí)創(chuàng)建一個(gè)局部命名空間,我們可以通過(guò)globals()和locals()內(nèi)建函數(shù)判斷某一名字屬于哪個(gè)名稱(chēng)空間。locals()是只讀的,globals()不是。
當(dāng)函數(shù)被調(diào)用時(shí)創(chuàng)建一個(gè)局部命名空間,我們可以通過(guò)global【實(shí)例6-8】locals()函數(shù)示例。
deffoo(arg,a):
x=1
y='abc'
foriinrange(5):
j=2
k=i
print(locals())
#調(diào)用函數(shù)的打印結(jié)果
foo(2,3)
locals()實(shí)際上沒(méi)有返回局部命名空間,它返回的是一個(gè)拷貝。所以對(duì)它進(jìn)行改變對(duì)局部命名空間中的變量值并無(wú)影響。
【實(shí)例6-8】locals()函數(shù)示例。
deffoo(a【實(shí)例6-9】globals()函數(shù)示例。
print("當(dāng)前的全局命名空間:")
var=globals()
print(var)
globals()函數(shù)返回實(shí)際的全局命名空間,而不是一個(gè)拷貝。所以對(duì)globals()函數(shù)所返回的var的任何改動(dòng)都會(huì)直接影響到全局變量?!緦?shí)例6-9】globals()函數(shù)示例。
print("當(dāng)3.嵌套函數(shù)命名空間的查找步驟:(1)先在當(dāng)前函數(shù)(嵌套的函數(shù)或lambda匿名函數(shù))的命名空間中搜索。(2)然后在父函數(shù)的命名空間中搜索。(3)接著在模塊命名空間中搜索。(4)最后在內(nèi)建函數(shù)的命名空間中搜索。下面舉例說(shuō)明。3.嵌套函數(shù)命名空間的查找步驟:
【實(shí)例6-10】嵌套函數(shù)命名空間示例。
address="地址:"
deffunc_country(country):
deffunc_part(part):
city="天津"#覆蓋父函數(shù)的part變量
print(address+country+city+part)
city="北京"#初始化city變量
#調(diào)用內(nèi)部函數(shù)
func_part("西青")#初始化part變量
#調(diào)用外部函數(shù)
func_country("中國(guó)")#初始化country變量
以上實(shí)例中,address在全局命名空間中,country在父函數(shù)的命名空間中,city、part在子函數(shù)的命名空間中。
【實(shí)例6-10】嵌套函數(shù)命名空間示例。
address=6.2Python類(lèi)與對(duì)象
6.2.1類(lèi)對(duì)象類(lèi)對(duì)象支持兩種操作:屬性引用和實(shí)例化。
類(lèi)對(duì)象的屬性引用和Python中所有屬性的引用一樣,都使用標(biāo)準(zhǔn)的語(yǔ)法:。類(lèi)對(duì)象創(chuàng)建之后,類(lèi)命名空間中所有的命名都是有效屬性名。
6.2Python類(lèi)與對(duì)象
6.2.1類(lèi)對(duì)象在Python中,方法定義在類(lèi)的定義中,但只能被類(lèi)對(duì)象的實(shí)例所調(diào)用。調(diào)用一個(gè)方法的途徑分三步:1.定義類(lèi)和類(lèi)中的方法。2.創(chuàng)建一個(gè)或若干個(gè)實(shí)例,即將類(lèi)實(shí)例化。3.用所創(chuàng)建的實(shí)例調(diào)用方法。在Python中,方法定義在類(lèi)的定義中,但只能被類(lèi)對(duì)象的實(shí)例【實(shí)例6-11】類(lèi)的定義與實(shí)例化。
classMyClass:
"""一個(gè)簡(jiǎn)單的類(lèi)實(shí)例"""
i=12
deff(self):
return'helloworld'
#實(shí)例化類(lèi)
MyClass=MyClass()
#訪(fǎng)問(wèn)類(lèi)的屬性和方法
print("MyClass類(lèi)的屬性i為:",MyClass.i)
print("MyClass類(lèi)的方法f輸出為:",MyClass.f())
【實(shí)例6-11】類(lèi)的定義與實(shí)例化。
classMyClas本例中,MyClass.i和MyClass.f()是有效的屬性引用,分別返回一個(gè)整數(shù)和一個(gè)方法對(duì)象。也可以對(duì)類(lèi)屬性賦值,即可以通過(guò)給MyClass.i賦值來(lái)修改它。如:
MyClass.i=56
print("修改后MyClass類(lèi)的屬性i為:",MyClass.i)
本例中,MyClass.i和MyClass.f()是有效的屬類(lèi)的實(shí)例化使用函數(shù)符號(hào),只要將類(lèi)對(duì)象看作是一個(gè)返回新的類(lèi)實(shí)例的無(wú)參數(shù)函數(shù)即可。例如(假設(shè)沿用前面的類(lèi)):
MyClass=MyClass()
該語(yǔ)句創(chuàng)建了一個(gè)新的類(lèi)實(shí)例(對(duì)象),并將該對(duì)象賦給局部變量MyClass。通過(guò)實(shí)例化操作(“調(diào)用”一個(gè)類(lèi)對(duì)象)來(lái)創(chuàng)建一個(gè)空的對(duì)象時(shí),通常會(huì)把這個(gè)新建的實(shí)例賦給一個(gè)變量。賦值在語(yǔ)法上不是必須的,但如果不把這個(gè)實(shí)例保存到一個(gè)變量中,它就沒(méi)有用,會(huì)被垃圾收集器自動(dòng)回收,因?yàn)闆](méi)有任何引用指向這個(gè)實(shí)例。
類(lèi)的實(shí)例化使用函數(shù)符號(hào),只要將類(lèi)對(duì)象看作是一個(gè)返回新的類(lèi)實(shí)例很多類(lèi)都傾向于創(chuàng)建一個(gè)有初始化狀態(tài)的對(duì)象。因此類(lèi)可能會(huì)定義一個(gè)名為_(kāi)_init__()的特殊方法(構(gòu)造方法),像下面這樣:
def__init__(self):
self.data=[]很多類(lèi)都傾向于創(chuàng)建一個(gè)有初始化狀態(tài)的對(duì)象。因此類(lèi)可能會(huì)定義一當(dāng)類(lèi)被調(diào)用時(shí),實(shí)例化的第一步就是創(chuàng)建實(shí)例對(duì)象,一旦對(duì)象創(chuàng)建,Python就檢查是否已經(jīng)實(shí)現(xiàn)__init__()方法。默認(rèn)情況下,如果沒(méi)有定義(或覆蓋)特殊方法__init__(),對(duì)實(shí)例不會(huì)施加任何特別的操作。任何所需的特定操作,都需要程序員實(shí)現(xiàn)__init__()方法,覆蓋它的默認(rèn)行為。所以在下例中,可以這樣創(chuàng)建一個(gè)新的實(shí)例:
MyClass_1=MyClass()__init__()方法可以有參數(shù)。事實(shí)上,正是通過(guò)__init__()方法,參數(shù)被傳遞到類(lèi)的實(shí)例上。
當(dāng)類(lèi)被調(diào)用時(shí),實(shí)例化的第一步就是創(chuàng)建實(shí)例對(duì)象,一旦對(duì)象創(chuàng)建,【實(shí)例6-12】使用帶參數(shù)的__init__()方法初始化。
classComplex:
def__init__(self,realpart,imagpart):
self.r=realpart
self.i=imagpart
x=Complex(2.4,-4.6)
print(x.r,x.i)
【實(shí)例6-12】使用帶參數(shù)的__init__()方法初始化。
6.2.2類(lèi)的屬性有兩種有效的屬性名:數(shù)據(jù)屬性和特殊類(lèi)屬性。1.數(shù)據(jù)屬性
這相當(dāng)于Smalltalk中的“實(shí)例變量”或C++中的“數(shù)據(jù)成員”。和局部變量一樣,數(shù)據(jù)屬性不需要聲明,第一次使用時(shí)它們就會(huì)生成。
6.2.2類(lèi)的屬性【實(shí)例6-13】數(shù)據(jù)屬性說(shuō)明。
classfoo(object):
f=100
print(foo.f)
print(foo.f+1)
【實(shí)例6-13】數(shù)據(jù)屬性說(shuō)明。
classfoo(obje2.特殊類(lèi)屬性
對(duì)任何類(lèi)foo,類(lèi)foo的部分特殊屬性如表6-2所示。
2.特殊類(lèi)屬性
對(duì)任何類(lèi)foo,類(lèi)foo的部分特殊屬性如表6表6-2特殊類(lèi)屬性類(lèi)屬性類(lèi)屬性說(shuō)明foo.__name__類(lèi)foo的名字(字符串)foo.__doc__類(lèi)foo的文檔字符串foo.__bases__類(lèi)foo的所有父類(lèi)構(gòu)成的元組foo.__dict__類(lèi)foo的屬性foo.__module__類(lèi)foo定義所在的模塊foo.__class__實(shí)例foo對(duì)應(yīng)的類(lèi)表6-2特殊類(lèi)屬
【實(shí)例6-14】類(lèi)屬性說(shuō)明。
classMyClass(object):
"""MyClass類(lèi)定義"""
myVer='3.4'
defshowMyVer(self):
print(MyClass.myVer)
print(di
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 標(biāo)準(zhǔn)租房合同協(xié)議
- 汽車(chē)居間協(xié)議合同
- 勞務(wù)合同協(xié)議書(shū)
- 七年級(jí)上冊(cè)地理聽(tīng)課評(píng)課記錄人教版4篇
- 單位向個(gè)人租車(chē)合同年
- 押證不押車(chē)健身貸款合同
- 酒店內(nèi)部商鋪?zhàn)赓U合同范本
- 2024年生物科技項(xiàng)目運(yùn)營(yíng)合同
- 公司員工勞動(dòng)合同范本
- 入住酒店合同范本
- 慢性壓力對(duì)身體健康的影響與調(diào)理方法
- 《白蛇緣起》賞析
- Interstellar-星際穿越課件
- 蘇教版2022-2023學(xué)年三年級(jí)數(shù)學(xué)下冊(cè)開(kāi)學(xué)摸底考試卷(五)含答案與解析
- 2023學(xué)年度第一學(xué)期高三英語(yǔ)備課組工作總結(jié)
- 臨建標(biāo)準(zhǔn)化圖集新版
- 安監(jiān)人員考核細(xì)則(2篇)
- 生活老師培訓(xùn)資料課件
- 腹主動(dòng)脈瘤(護(hù)理業(yè)務(wù)學(xué)習(xí))
- 大學(xué)生就業(yè)指導(dǎo)PPT(第2版)全套完整教學(xué)課件
- 家具安裝工培訓(xùn)教案優(yōu)質(zhì)資料
評(píng)論
0/150
提交評(píng)論