Python面向?qū)ο缶幊虒?zhuān)題培訓(xùn)課件_第1頁(yè)
Python面向?qū)ο缶幊虒?zhuān)題培訓(xùn)課件_第2頁(yè)
Python面向?qū)ο缶幊虒?zhuān)題培訓(xùn)課件_第3頁(yè)
Python面向?qū)ο缶幊虒?zhuān)題培訓(xùn)課件_第4頁(yè)
Python面向?qū)ο缶幊虒?zhuān)題培訓(xùn)課件_第5頁(yè)
已閱讀5頁(yè),還剩137頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論