




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Python面向?qū)ο缶幊蘌ython面向?qū)ο缶幊堂嫦驅(qū)ο蟮囊恍┗靖拍詈吞卣?/p>
類:用來描述具有相同屬性和方法的對(duì)象的集合,它定義該集合中每個(gè)對(duì)象所共有的屬性和方法,對(duì)象是類的實(shí)例。類變量:類變量在整個(gè)實(shí)例化的對(duì)象中是公用的,類變量定義在類中且在函數(shù)體之外,類變量通常不作為實(shí)例變量使用。數(shù)據(jù)成員:類變量或者實(shí)例變量用于處理類及其實(shí)例對(duì)象的相關(guān)數(shù)據(jù)。方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對(duì)其進(jìn)行改寫,這個(gè)過程叫方法的覆蓋(override)。
面向?qū)ο蟮囊恍┗靖拍詈吞卣?/p>
類:用來描述具有相同屬性和方實(shí)例變量:定義在方法中的變量,只作用于當(dāng)前實(shí)例的類。繼承:即一個(gè)派生類(derivedclass)繼承基類(baseclass)的字段和方法,繼承也允許把一個(gè)派生類的對(duì)象作為一個(gè)基類對(duì)象對(duì)待。實(shí)例化:創(chuàng)建一個(gè)類的實(shí)例,類的具體對(duì)象。方法:類中定義的函數(shù)。對(duì)象:對(duì)象包括兩類數(shù)據(jù)成員(類變量和實(shí)例變量)和方法,通過類定義的數(shù)據(jù)結(jié)構(gòu)實(shí)例化。
實(shí)例變量:定義在方法中的變量,只作用于當(dāng)前實(shí)例的類。6.1類的定義與使用
Python中的類是一個(gè)抽象的概念,比函數(shù)還要抽象。我們可以把它簡(jiǎn)單看做是數(shù)據(jù)以及由存取、操作這些數(shù)據(jù)的方法所組成的一個(gè)集合。那為什么還要用類來取代函數(shù)呢?6.1類的定義與使用
Python中的類是一個(gè)抽象的概念
類有如下優(yōu)點(diǎn):類對(duì)象是多態(tài)的:也就是具有多種形態(tài),這意味著我們可以對(duì)不同的類對(duì)象使用同樣的操作方法,而不需要額外編寫代碼。類的封裝:類封裝之后,可以直接調(diào)用類的對(duì)象來操作內(nèi)部的一些類方法,不需要讓使用者看到代碼工作的細(xì)節(jié)。類的繼承:類可以從其它類或者基類中繼承它們的方法,直接使用。
類有如下優(yōu)點(diǎn):類對(duì)象是多態(tài)的:也就是具有多種形態(tài),這意味著6.1.1類的定義
類是對(duì)現(xiàn)實(shí)世界中一些事物的封裝,所有類的開頭都要包括關(guān)鍵字class,緊接著的是類名和冒號(hào),隨后是定義類的類體代碼。
語法格式如下:
classClassName:
"""documentationstring"""
<statement_1>
<statement_2>
......
<statement-N>
6.1.1類的定義
類是對(duì)現(xiàn)實(shí)世界中一些事物的封裝,所有object是“所有類之父”。如果你的類沒有繼承任何其他父類,object將作為默認(rèn)的父類,它位于所有類繼承結(jié)構(gòu)的最上層(繼承的概念在本章稍后介紹),定義一個(gè)類可以采用下面的方式。object是“所有類之父”。如果你的類沒有繼承任何其他父類【實(shí)例6-1】類的定義。
classpeople:
#定義基本屬性
name=''
age=0
#定義私有屬性,私有屬性在類外部無法直接進(jìn)行訪問
__weight=0
#定義構(gòu)造方法
def__init__(self,n,a,w):
=n
self.age=a
self.__weight=w
#定義類本身的方法
defspeak(self):
print("%sisspeaking:Iam%dyearsold"%(,self.age))
#類調(diào)用
p=people('tom',10,30)
p.speak()
【實(shí)例6-1】類的定義。
classpeople:
注意:在上面的例子中,name和age是類的公有屬性。__weight使用兩個(gè)下劃線開頭,表示聲明該屬性為私有屬性,它不能在類的外部被使用或直接訪問,但可以在類內(nèi)部使用self.__weight調(diào)用。注意:在上面的例子中,name和age是類的公有屬性。__w【實(shí)例6-2】接上例。
print()
print(p.__weight)
出錯(cuò)的原因在于,在類的外部使用了私有屬性。
【實(shí)例6-2】接上例。
print()
prin6.1.2類屬性與方法
1.類的公有屬性
public_attrs:符合正常的變量命名規(guī)則,開頭沒有下劃線,類外部可以直接進(jìn)行訪問。如上例中的name、age等。2.類的私有屬性
__private_attrs:由兩個(gè)下劃線開頭,聲明該屬性為私有,不能在類的外部被使用或直接訪問。在類內(nèi)部的方法中使用時(shí)的格式為self.__private_attrs。6.1.2類屬性與方法
1.類的公有屬性
public_
【實(shí)例6-3】類的私有屬性。
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í)例不能訪問私有屬性
出錯(cuò)的原因在于,在類的外部使用了私有屬性。
【實(shí)例6-3】類的私有屬性。
classCounter:3.類的構(gòu)造方法
__init__:叫作構(gòu)造函數(shù)或者構(gòu)造方法,它在生成一個(gè)對(duì)象時(shí)被自動(dòng)調(diào)用。在上文的例子中p=people('tom',10,30)語句就是調(diào)用__init__方法將參數(shù)傳遞給、self.age和self.__weight。4.類的公共方法
public_method:在類的內(nèi)部,使用def關(guān)鍵字可以為類定義一個(gè)方法,與一般函數(shù)定義不同,類方法必須包含參數(shù)self,且為第一個(gè)參數(shù)。self在Python里不是關(guān)鍵字,self代表當(dāng)前對(duì)象的地址,類似于Java語言中的this。3.類的構(gòu)造方法
__init__:叫作構(gòu)造函數(shù)或者構(gòu)造方法
5.類的私有方法
__private_method:由兩個(gè)下劃線開頭,聲明該方法為私有方法,不能在類的外部調(diào)用。在類的內(nèi)部調(diào)用時(shí)格式為self.__private_methods。
5.類的私有方法
__private_method:由兩個(gè)【實(shí)例6-4】類的私有方法。
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í)例不能訪問私有屬性
【實(shí)例6-4】類的私有方法。
classSite:
出錯(cuò)的原因在于,實(shí)例不能訪問私有方法。Python面向?qū)ο缶幊虒n}培訓(xùn)課件6.單下劃線(_)
以單下劃線開始的成員變量叫做保護(hù)變量,意思是只有類對(duì)象和子類對(duì)象自己能訪問到這些變量,簡(jiǎn)單的模塊級(jí)私有化只需要在屬性名前使用一個(gè)單下劃線字符。以單下劃線開頭(_singlePrivate)的屬性代表不能直接訪問的類屬性,需通過類提供的接口進(jìn)行訪問,這就防止模塊的屬性用“frommymoduleimport*”來加載,這是嚴(yán)格基于作用域的,所以這同樣適合于函數(shù)。
6.單下劃線(_)
以單下劃線開始的成員變量叫做保護(hù)變量,意【實(shí)例6-5】下劃線的使用。
classTest():
def__init__(self):
pass
defpublic(self):
print('這是公共方法')
def_singlePrivate(self):
print('這是單下劃線方法')
def__doublePrivate(self):
print('這是雙下劃線方法')
t=Test()
t.public()#可以調(diào)用
t._singlePrivate()#可以調(diào)用
t.__doublePrivate()#出現(xiàn)錯(cuò)誤
【實(shí)例6-5】下劃線的使用。
classTest():
注意:f._singlePrivate()可以直接訪問,不過根據(jù)Python的約定,應(yīng)該將其視作private,而不要在外部使用它們,良好的編程習(xí)慣是不要在外部使用它。同時(shí),根據(jù)Pythondocs的說明,_object和__object的作用域限制在本模塊內(nèi)。Python面向?qū)ο缶幊虒n}培訓(xùn)課件
7.類的專有方法
下面是Python常用的一些專有方法,如表6-1所示。
7.類的專有方法
下面是Python常用的一些專有方法,表6-1類的專有方法專有方法專有方法說明__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類的專有方法專有方法專有方法說明__init__構(gòu)【例6-6】__del__和__repr__專有方法的使用。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__專有方法的使用?!緦?shí)例6-7】__str__專有方法的使用。
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__專有方法的使用。
classT6.1.3關(guān)于Python的作用域和命名空間
。
1.作用域與命名空間的解釋作用域是指Python程序可以直接訪問到的命名空間?!爸苯釉L問”在這里意味著訪問命名空間中的命名時(shí)無需加入附加的修飾符。
命名空間本質(zhì)上是一個(gè)字典,它的鍵就是變量名,它的值就是那些變量的值。Python使用命名空間來記錄變量的軌跡。6.1.3關(guān)于Python的作用域和命名空間
。
1.作在Python程序中的任何一個(gè)地方,都存在三個(gè)可用的命名空間:(1)每個(gè)函數(shù)都有自已的命名空間(稱作局部命名空間),它記錄了函數(shù)的變量,包括函數(shù)的參數(shù)和局部定義的變量。(2)每個(gè)模塊都有自已的命名空間(稱作全局命名空間),它記錄了模塊的變量,包括函數(shù)、類、其它導(dǎo)入的模塊、模塊級(jí)的變量和常量。(3)每個(gè)模塊都有可訪問的內(nèi)置命名空間,它存放著內(nèi)置函數(shù)和異常。在Python程序中的任何一個(gè)地方,都存在三個(gè)可用的命名空間2.命名空間的查找順序(1)局部命名空間——特指當(dāng)前函數(shù)或類的方法。如果函數(shù)中定義一個(gè)局部變量x,Python將使用這個(gè)變量,然后停止搜索。(2)全局命名空間——特指當(dāng)前的模塊。如果模塊中定義名為x的變量、函數(shù)或類,Python將使用這個(gè)變量,然后停止搜索。Python面向?qū)ο缶幊虒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è)局部命名空間,我們可以通過globals()和locals()內(nèi)建函數(shù)判斷某一名字屬于哪個(gè)名稱空間。locals()是只讀的,globals()不是。
當(dāng)函數(shù)被調(diào)用時(shí)創(chuàng)建一個(gè)局部命名空間,我們可以通過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í)際上沒有返回局部命名空間,它返回的是一個(gè)拷貝。所以對(duì)它進(jìn)行改變對(duì)局部命名空間中的變量值并無影響。
【實(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ù)的命名空間中搜索。下面舉例說明。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類與對(duì)象
6.2.1類對(duì)象類對(duì)象支持兩種操作:屬性引用和實(shí)例化。
類對(duì)象的屬性引用和Python中所有屬性的引用一樣,都使用標(biāo)準(zhǔn)的語法:。類對(duì)象創(chuàng)建之后,類命名空間中所有的命名都是有效屬性名。
6.2Python類與對(duì)象
6.2.1類對(duì)象在Python中,方法定義在類的定義中,但只能被類對(duì)象的實(shí)例所調(diào)用。調(diào)用一個(gè)方法的途徑分三步:1.定義類和類中的方法。2.創(chuàng)建一個(gè)或若干個(gè)實(shí)例,即將類實(shí)例化。3.用所創(chuàng)建的實(shí)例調(diào)用方法。在Python中,方法定義在類的定義中,但只能被類對(duì)象的實(shí)例【實(shí)例6-11】類的定義與實(shí)例化。
classMyClass:
"""一個(gè)簡(jiǎn)單的類實(shí)例"""
i=12
deff(self):
return'helloworld'
#實(shí)例化類
MyClass=MyClass()
#訪問類的屬性和方法
print("MyClass類的屬性i為:",MyClass.i)
print("MyClass類的方法f輸出為:",MyClass.f())
【實(shí)例6-11】類的定義與實(shí)例化。
classMyClas本例中,MyClass.i和MyClass.f()是有效的屬性引用,分別返回一個(gè)整數(shù)和一個(gè)方法對(duì)象。也可以對(duì)類屬性賦值,即可以通過給MyClass.i賦值來修改它。如:
MyClass.i=56
print("修改后MyClass類的屬性i為:",MyClass.i)
本例中,MyClass.i和MyClass.f()是有效的屬類的實(shí)例化使用函數(shù)符號(hào),只要將類對(duì)象看作是一個(gè)返回新的類實(shí)例的無參數(shù)函數(shù)即可。例如(假設(shè)沿用前面的類):
MyClass=MyClass()
該語句創(chuàng)建了一個(gè)新的類實(shí)例(對(duì)象),并將該對(duì)象賦給局部變量MyClass。通過實(shí)例化操作(“調(diào)用”一個(gè)類對(duì)象)來創(chuàng)建一個(gè)空的對(duì)象時(shí),通常會(huì)把這個(gè)新建的實(shí)例賦給一個(gè)變量。賦值在語法上不是必須的,但如果不把這個(gè)實(shí)例保存到一個(gè)變量中,它就沒有用,會(huì)被垃圾收集器自動(dòng)回收,因?yàn)闆]有任何引用指向這個(gè)實(shí)例。
類的實(shí)例化使用函數(shù)符號(hào),只要將類對(duì)象看作是一個(gè)返回新的類實(shí)例很多類都傾向于創(chuàng)建一個(gè)有初始化狀態(tài)的對(duì)象。因此類可能會(huì)定義一個(gè)名為__init__()的特殊方法(構(gòu)造方法),像下面這樣:
def__init__(self):
self.data=[]很多類都傾向于創(chuàng)建一個(gè)有初始化狀態(tài)的對(duì)象。因此類可能會(huì)定義一當(dāng)類被調(diào)用時(shí),實(shí)例化的第一步就是創(chuàng)建實(shí)例對(duì)象,一旦對(duì)象創(chuàng)建,Python就檢查是否已經(jīng)實(shí)現(xiàn)__init__()方法。默認(rèn)情況下,如果沒有定義(或覆蓋)特殊方法__init__(),對(duì)實(shí)例不會(huì)施加任何特別的操作。任何所需的特定操作,都需要程序員實(shí)現(xiàn)__init__()方法,覆蓋它的默認(rèn)行為。所以在下例中,可以這樣創(chuàng)建一個(gè)新的實(shí)例:
MyClass_1=MyClass()__init__()方法可以有參數(shù)。事實(shí)上,正是通過__init__()方法,參數(shù)被傳遞到類的實(shí)例上。
當(dāng)類被調(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類的屬性有兩種有效的屬性名:數(shù)據(jù)屬性和特殊類屬性。1.數(shù)據(jù)屬性
這相當(dāng)于Smalltalk中的“實(shí)例變量”或C++中的“數(shù)據(jù)成員”。和局部變量一樣,數(shù)據(jù)屬性不需要聲明,第一次使用時(shí)它們就會(huì)生成。
6.2.2類的屬性【實(shí)例6-13】數(shù)據(jù)屬性說明。
classfoo(object):
f=100
print(foo.f)
print(foo.f+1)
【實(shí)例6-13】數(shù)據(jù)屬性說明。
classfoo(obje2.特殊類屬性
對(duì)任何類foo,類foo的部分特殊屬性如表6-2所示。
2.特殊類屬性
對(duì)任何類foo,類foo的部分特殊屬性如表6表6-2特殊類屬性類屬性類屬性說明foo.__name__類foo的名字(字符串)foo.__doc__類foo的文檔字符串foo.__bases__類foo的所有父類構(gòu)成的元組foo.__dict__類foo的屬性foo.__module__類foo定義所在的模塊foo.__class__實(shí)例foo對(duì)應(yīng)的類表6-2特殊類屬
【實(shí)例6-14】類屬性說明。
classMyClass(object):
"""MyClass類定義"""
myVer='3.4'
defshowMyVer(self):
print(MyClass.myVer)
print(dir(MyClass))
print(MyClass.__dict__)根據(jù)上面定義的類,我們使用dir()和特殊類屬性__dict__來查看一下類的屬性:
【實(shí)例6-14】類屬性說明。
classMyClass(從上面可以看到,dir()返回的僅是對(duì)象的屬性的一個(gè)名字列表,而__dict__返回的是一個(gè)字典,它的鍵是屬性名,值是相應(yīng)的屬性對(duì)象的數(shù)據(jù)值。結(jié)果還顯示MyClass類中兩個(gè)熟悉的屬性,showMyVer和myVer,以及一些新的屬性。Python面向?qū)ο缶幊虒n}培訓(xùn)課件6.2.3實(shí)例屬性
內(nèi)建函數(shù)dir()可以顯示類屬性,同樣還可以打印所有實(shí)例屬性。【實(shí)例6-15】實(shí)例屬性說明。
classfoo(object):
pass
foo_1=foo()
print(dir(foo_1))
6.2.3實(shí)例屬性
內(nèi)建函數(shù)dir()可以顯示類屬性,同樣還
實(shí)例有兩個(gè)特殊屬性,如表6-3所示。
表6-3特殊實(shí)例屬性實(shí)例屬性實(shí)例屬性說明foo_1.__class__實(shí)例化foo_1的類foo_1.__dict__foo_1的屬性
實(shí)例有兩個(gè)特殊屬性,如表6-3所示。
現(xiàn)在使用類foo及其實(shí)例foo_1來看看這些特殊實(shí)例屬性?!緦?shí)例6-16】查看實(shí)例屬性__dict__和__class__。
classfoo(object):
pass
foo_1=foo()
print(foo_1.__dict__)
print(foo_1.__class__)
現(xiàn)在使用類foo及其實(shí)例foo_1來看看這些特殊實(shí)例屬性。foo_1現(xiàn)在還沒有數(shù)據(jù)屬性,但我們可以添加一些再來檢查__dict__屬性?!緦?shí)例6-17】查看類的數(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)在還沒有數(shù)據(jù)屬性,但我們可以添加一些再來檢查__注意:__dict__屬性由一個(gè)字典組成,包含一個(gè)實(shí)例的所有屬性。鍵是屬性名,值是屬性相應(yīng)的數(shù)據(jù)值。字典中僅有實(shí)例屬性,沒有類屬性或特殊屬性。
Python面向?qū)ο缶幊虒n}培訓(xùn)課件
6.2.4一些說明同名的數(shù)據(jù)屬性會(huì)覆蓋方法屬性,最好以某種命名約定來避免沖突,因?yàn)檫@在大型程序中可能會(huì)導(dǎo)致難以發(fā)現(xiàn)的bug??蛇x的約定包括:(1)類名由大寫字母書寫。(2)方法的首字母大寫。(3)數(shù)據(jù)屬性名前綴小寫(可能只是一個(gè)下劃線)。(4)方法使用動(dòng)詞而數(shù)據(jù)屬性使用名詞。
6.2.4一些說明數(shù)據(jù)屬性可以由方法引用,也可以由普通用戶調(diào)用。程序員應(yīng)該小心使用數(shù)據(jù)屬性,程序員可能會(huì)因?yàn)殡S意修改數(shù)據(jù)屬性而破壞本來由方法維護(hù)的數(shù)據(jù)一致性。需要注意的是,程序員只要注意避免命名沖突,就可以隨意向?qū)嵗刑砑訑?shù)據(jù)屬性而不會(huì)影響方法的有效性--再次強(qiáng)調(diào),命名約定可以省去很多麻煩。
數(shù)據(jù)屬性可以由方法引用,也可以由普通用戶調(diào)用。對(duì)Python而言,self絕對(duì)沒有任何特殊含義。通過使用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ì)沒有任何特殊含義。通過使用s6.3繼承
6.3.1單繼承Python同樣支持類的繼承,如果一種語言不支持繼承,類就沒有什么意義,類還允許派生,用戶可以創(chuàng)建一個(gè)子類,它也是類,而且繼承父類所有的特征和屬性。派生類的定義如下所示:
classDerivedClassName(BaseClassName):
<statement-1>
……
<statement-N>命名BaseClassName(示例中的基類名)必須與派生類定義在一個(gè)作用域內(nèi)?;惪梢远x在另一個(gè)模塊中,這一點(diǎn)非常有用,格式如下:
classDerivedClassName(modname.BaseClassName):
6.3繼承
6.3.1單繼承【實(shí)例6-19】單繼承實(shí)例。
#類定義
classpeople:
#定義基本屬性
name=''
age=0
#定義私有屬性,私有屬性在類外部無法直接進(jì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í)例。
#類定義
classpeop#單繼承
classstudent(people):
grade=''
def__init__(self,n,a,w,g):
#調(diào)用父類的構(gòu)造函數(shù)
people.__init__(self,n,a,w)
self.grade=g
#重寫父類的方法
defspeak(self):
print("%ssays:Iam%dyearsold,IaminGrade%d."%(,self.age,self.grade))s=student(‘Tom’,10,90,3)
s.speak()
#單繼承
classstudent(people):
提示:派生類定義的執(zhí)行過程和基類是一樣的。構(gòu)造派生類對(duì)象時(shí),就繼承基類。這在解析屬性引用的時(shí)候尤其有用:如果在類中找不到請(qǐng)求調(diào)用的屬性,就搜索基類。如果基類是由別的類派生而來,這個(gè)規(guī)則會(huì)遞歸地應(yīng)用上去。
提示:6.3.2多繼承Python同樣有限地支持多繼承形式,多繼承的類定義的一般形式如下:
classDerivedClassName(Base1,Base2,Base3):
<statement-1>
……
<statement-N>這里唯一需要解釋的語義是解析類屬性的規(guī)則。順序是深度優(yōu)先,從左到右。因此,如果在DerivedClassName(示例中的派生類)中沒有找到某個(gè)屬性,就會(huì)搜索Base1,然后遞歸地搜索其基類,如果最終沒有找到,就搜索Base2,依此類推。深度優(yōu)先不區(qū)分屬性繼承自基類還是直接定義。
6.3.2多繼承【實(shí)例6-20】多繼承實(shí)例。
#類定義
classpeople:
#定義基本屬性
name=''
age=0
#定義私有屬性,私有屬性在類外部無法直接進(jì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í)例。
#類定義
classpeop#單繼承示例
classstudent(people):
grade=‘’
def__init__(self,n,a,w,g):
#調(diào)用父類的構(gòu)函
people.__init__(self,n,a,w)
self.grade=g
#覆寫父類的方法
defspeak(self):
print(“%ssays:Iam%dyearsold,IaminGrade%d.”
%(,self.age,self.grade))
Python面向?qū)ο缶幊虒n}培訓(xùn)課件#另一個(gè)類,多重繼承之前的準(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)中排前的父類的方法,即speaker類里面的方法。
#另一個(gè)類,多重繼承之前的準(zhǔn)備
classspeaker(
注意:不加限制地使用多繼承會(huì)帶來維護(hù)上的噩夢(mèng),因?yàn)镻ython中只依靠約定來避免命名沖突。多繼承一個(gè)很有名的問題是派生繼承的兩個(gè)基類都是從同一個(gè)基類繼承而來。目前還不清楚這在語義上有什么意義,然而這會(huì)造成意料之外的后果。
注意:不加限制地使用多繼承會(huì)帶來維護(hù)上的噩夢(mèng),因?yàn)镻yth6.3.3方法重寫
如果父類方法的功能不能滿足需求,可以在子類里面重寫父類的方法?!緦?shí)例6-21】方法重寫。
classParent:#定義父類
defmyMethod(self):
print('調(diào)用父類方法')
classChild(Parent):#定義子類
defmyMethod(self):
print('調(diào)用子類方法')
Child_1=Child()#子類實(shí)例
Child_1.myMethod()#子類調(diào)用重寫方法
6.3.3方法重寫
如果父類方法的功能不能滿足需求,可以在6.4項(xiàng)目實(shí)例類與繼承實(shí)例
本例定義三個(gè)類,分別為Member類、Student類、Teacher類,Student類和Teacher類分別繼承Member類,并且定義自己的tell()方法,其中使用了Member類的方法。
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.類的定義與使用首先介紹類、類變量、數(shù)據(jù)成員、方法重寫、實(shí)例變量、繼承、實(shí)例化、方法、對(duì)象等概念;其次介紹類的定義與使用,包括使用類的優(yōu)點(diǎn)、類定義的語法格式、類的屬性與方法以及Python常用的專有方法。6.5本章小結(jié)本章對(duì)面向?qū)ο蠹夹g(shù)進(jìn)行了簡(jiǎn)單介紹,重點(diǎn)內(nèi)容如2.類與對(duì)象
首先介紹類對(duì)象支持的兩種操作:屬性引用和實(shí)例化;其次介紹類的屬性:兩種有效的屬性名、數(shù)據(jù)屬性和特殊類屬性,包括__name__、__doc__等;再次介紹實(shí)例屬性:內(nèi)建函數(shù)dir()的使用、兩個(gè)特殊屬性__class__和__dict__等;最后介紹命名約定,并對(duì)self的使用情況進(jìn)行舉例說明。
2.類與對(duì)象
首先介紹類對(duì)象支持的兩種操作:屬性引用和實(shí)例化3.類的繼承
首先介紹了單繼承和多繼承的概念,并分別舉例說明;其次介紹了方法重寫。4.實(shí)例項(xiàng)目
類的繼承、方法重寫。3.類的繼承
首先介紹了單繼承和多繼承的概念,并分別舉例說明本章結(jié)束謝謝Python面向?qū)ο缶幊虒n}培訓(xùn)課件Python面向?qū)ο缶幊蘌ython面向?qū)ο缶幊堂嫦驅(qū)ο蟮囊恍┗靖拍詈吞卣?/p>
類:用來描述具有相同屬性和方法的對(duì)象的集合,它定義該集合中每個(gè)對(duì)象所共有的屬性和方法,對(duì)象是類的實(shí)例。類變量:類變量在整個(gè)實(shí)例化的對(duì)象中是公用的,類變量定義在類中且在函數(shù)體之外,類變量通常不作為實(shí)例變量使用。數(shù)據(jù)成員:類變量或者實(shí)例變量用于處理類及其實(shí)例對(duì)象的相關(guān)數(shù)據(jù)。方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對(duì)其進(jìn)行改寫,這個(gè)過程叫方法的覆蓋(override)。
面向?qū)ο蟮囊恍┗靖拍詈吞卣?/p>
類:用來描述具有相同屬性和方實(shí)例變量:定義在方法中的變量,只作用于當(dāng)前實(shí)例的類。繼承:即一個(gè)派生類(derivedclass)繼承基類(baseclass)的字段和方法,繼承也允許把一個(gè)派生類的對(duì)象作為一個(gè)基類對(duì)象對(duì)待。實(shí)例化:創(chuàng)建一個(gè)類的實(shí)例,類的具體對(duì)象。方法:類中定義的函數(shù)。對(duì)象:對(duì)象包括兩類數(shù)據(jù)成員(類變量和實(shí)例變量)和方法,通過類定義的數(shù)據(jù)結(jié)構(gòu)實(shí)例化。
實(shí)例變量:定義在方法中的變量,只作用于當(dāng)前實(shí)例的類。6.1類的定義與使用
Python中的類是一個(gè)抽象的概念,比函數(shù)還要抽象。我們可以把它簡(jiǎn)單看做是數(shù)據(jù)以及由存取、操作這些數(shù)據(jù)的方法所組成的一個(gè)集合。那為什么還要用類來取代函數(shù)呢?6.1類的定義與使用
Python中的類是一個(gè)抽象的概念
類有如下優(yōu)點(diǎn):類對(duì)象是多態(tài)的:也就是具有多種形態(tài),這意味著我們可以對(duì)不同的類對(duì)象使用同樣的操作方法,而不需要額外編寫代碼。類的封裝:類封裝之后,可以直接調(diào)用類的對(duì)象來操作內(nèi)部的一些類方法,不需要讓使用者看到代碼工作的細(xì)節(jié)。類的繼承:類可以從其它類或者基類中繼承它們的方法,直接使用。
類有如下優(yōu)點(diǎn):類對(duì)象是多態(tài)的:也就是具有多種形態(tài),這意味著6.1.1類的定義
類是對(duì)現(xiàn)實(shí)世界中一些事物的封裝,所有類的開頭都要包括關(guān)鍵字class,緊接著的是類名和冒號(hào),隨后是定義類的類體代碼。
語法格式如下:
classClassName:
"""documentationstring"""
<statement_1>
<statement_2>
......
<statement-N>
6.1.1類的定義
類是對(duì)現(xiàn)實(shí)世界中一些事物的封裝,所有object是“所有類之父”。如果你的類沒有繼承任何其他父類,object將作為默認(rèn)的父類,它位于所有類繼承結(jié)構(gòu)的最上層(繼承的概念在本章稍后介紹),定義一個(gè)類可以采用下面的方式。object是“所有類之父”。如果你的類沒有繼承任何其他父類【實(shí)例6-1】類的定義。
classpeople:
#定義基本屬性
name=''
age=0
#定義私有屬性,私有屬性在類外部無法直接進(jìn)行訪問
__weight=0
#定義構(gòu)造方法
def__init__(self,n,a,w):
=n
self.age=a
self.__weight=w
#定義類本身的方法
defspeak(self):
print("%sisspeaking:Iam%dyearsold"%(,self.age))
#類調(diào)用
p=people('tom',10,30)
p.speak()
【實(shí)例6-1】類的定義。
classpeople:
注意:在上面的例子中,name和age是類的公有屬性。__weight使用兩個(gè)下劃線開頭,表示聲明該屬性為私有屬性,它不能在類的外部被使用或直接訪問,但可以在類內(nèi)部使用self.__weight調(diào)用。注意:在上面的例子中,name和age是類的公有屬性。__w【實(shí)例6-2】接上例。
print()
print(p.__weight)
出錯(cuò)的原因在于,在類的外部使用了私有屬性。
【實(shí)例6-2】接上例。
print()
prin6.1.2類屬性與方法
1.類的公有屬性
public_attrs:符合正常的變量命名規(guī)則,開頭沒有下劃線,類外部可以直接進(jìn)行訪問。如上例中的name、age等。2.類的私有屬性
__private_attrs:由兩個(gè)下劃線開頭,聲明該屬性為私有,不能在類的外部被使用或直接訪問。在類內(nèi)部的方法中使用時(shí)的格式為self.__private_attrs。6.1.2類屬性與方法
1.類的公有屬性
public_
【實(shí)例6-3】類的私有屬性。
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í)例不能訪問私有屬性
出錯(cuò)的原因在于,在類的外部使用了私有屬性。
【實(shí)例6-3】類的私有屬性。
classCounter:3.類的構(gòu)造方法
__init__:叫作構(gòu)造函數(shù)或者構(gòu)造方法,它在生成一個(gè)對(duì)象時(shí)被自動(dòng)調(diào)用。在上文的例子中p=people('tom',10,30)語句就是調(diào)用__init__方法將參數(shù)傳遞給、self.age和self.__weight。4.類的公共方法
public_method:在類的內(nèi)部,使用def關(guān)鍵字可以為類定義一個(gè)方法,與一般函數(shù)定義不同,類方法必須包含參數(shù)self,且為第一個(gè)參數(shù)。self在Python里不是關(guān)鍵字,self代表當(dāng)前對(duì)象的地址,類似于Java語言中的this。3.類的構(gòu)造方法
__init__:叫作構(gòu)造函數(shù)或者構(gòu)造方法
5.類的私有方法
__private_method:由兩個(gè)下劃線開頭,聲明該方法為私有方法,不能在類的外部調(diào)用。在類的內(nèi)部調(diào)用時(shí)格式為self.__private_methods。
5.類的私有方法
__private_method:由兩個(gè)【實(shí)例6-4】類的私有方法。
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í)例不能訪問私有屬性
【實(shí)例6-4】類的私有方法。
classSite:
出錯(cuò)的原因在于,實(shí)例不能訪問私有方法。Python面向?qū)ο缶幊虒n}培訓(xùn)課件6.單下劃線(_)
以單下劃線開始的成員變量叫做保護(hù)變量,意思是只有類對(duì)象和子類對(duì)象自己能訪問到這些變量,簡(jiǎn)單的模塊級(jí)私有化只需要在屬性名前使用一個(gè)單下劃線字符。以單下劃線開頭(_singlePrivate)的屬性代表不能直接訪問的類屬性,需通過類提供的接口進(jìn)行訪問,這就防止模塊的屬性用“frommymoduleimport*”來加載,這是嚴(yán)格基于作用域的,所以這同樣適合于函數(shù)。
6.單下劃線(_)
以單下劃線開始的成員變量叫做保護(hù)變量,意【實(shí)例6-5】下劃線的使用。
classTest():
def__init__(self):
pass
defpublic(self):
print('這是公共方法')
def_singlePrivate(self):
print('這是單下劃線方法')
def__doublePrivate(self):
print('這是雙下劃線方法')
t=Test()
t.public()#可以調(diào)用
t._singlePrivate()#可以調(diào)用
t.__doublePrivate()#出現(xiàn)錯(cuò)誤
【實(shí)例6-5】下劃線的使用。
classTest():
注意:f._singlePrivate()可以直接訪問,不過根據(jù)Python的約定,應(yīng)該將其視作private,而不要在外部使用它們,良好的編程習(xí)慣是不要在外部使用它。同時(shí),根據(jù)Pythondocs的說明,_object和__object的作用域限制在本模塊內(nèi)。Python面向?qū)ο缶幊虒n}培訓(xùn)課件
7.類的專有方法
下面是Python常用的一些專有方法,如表6-1所示。
7.類的專有方法
下面是Python常用的一些專有方法,表6-1類的專有方法專有方法專有方法說明__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類的專有方法專有方法專有方法說明__init__構(gòu)【例6-6】__del__和__repr__專有方法的使用。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__專有方法的使用。【實(shí)例6-7】__str__專有方法的使用。
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__專有方法的使用。
classT6.1.3關(guān)于Python的作用域和命名空間
。
1.作用域與命名空間的解釋作用域是指Python程序可以直接訪問到的命名空間?!爸苯釉L問”在這里意味著訪問命名空間中的命名時(shí)無需加入附加的修飾符。
命名空間本質(zhì)上是一個(gè)字典,它的鍵就是變量名,它的值就是那些變量的值。Python使用命名空間來記錄變量的軌跡。6.1.3關(guān)于Python的作用域和命名空間
。
1.作在Python程序中的任何一個(gè)地方,都存在三個(gè)可用的命名空間:(1)每個(gè)函數(shù)都有自已的命名空間(稱作局部命名空間),它記錄了函數(shù)的變量,包括函數(shù)的參數(shù)和局部定義的變量。(2)每個(gè)模塊都有自已的命名空間(稱作全局命名空間),它記錄了模塊的變量,包括函數(shù)、類、其它導(dǎo)入的模塊、模塊級(jí)的變量和常量。(3)每個(gè)模塊都有可訪問的內(nèi)置命名空間,它存放著內(nèi)置函數(shù)和異常。在Python程序中的任何一個(gè)地方,都存在三個(gè)可用的命名空間2.命名空間的查找順序(1)局部命名空間——特指當(dāng)前函數(shù)或類的方法。如果函數(shù)中定義一個(gè)局部變量x,Python將使用這個(gè)變量,然后停止搜索。(2)全局命名空間——特指當(dāng)前的模塊。如果模塊中定義名為x的變量、函數(shù)或類,Python將使用這個(gè)變量,然后停止搜索。Python面向?qū)ο缶幊虒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è)局部命名空間,我們可以通過globals()和locals()內(nèi)建函數(shù)判斷某一名字屬于哪個(gè)名稱空間。locals()是只讀的,globals()不是。
當(dāng)函數(shù)被調(diào)用時(shí)創(chuàng)建一個(gè)局部命名空間,我們可以通過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í)際上沒有返回局部命名空間,它返回的是一個(gè)拷貝。所以對(duì)它進(jìn)行改變對(duì)局部命名空間中的變量值并無影響。
【實(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ù)的命名空間中搜索。下面舉例說明。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類與對(duì)象
6.2.1類對(duì)象類對(duì)象支持兩種操作:屬性引用和實(shí)例化。
類對(duì)象的屬性引用和Python中所有屬性的引用一樣,都使用標(biāo)準(zhǔn)的語法:。類對(duì)象創(chuàng)建之后,類命名空間中所有的命名都是有效屬性名。
6.2Python類與對(duì)象
6.2.1類對(duì)象在Python中,方法定義在類的定義中,但只能被類對(duì)象的實(shí)例所調(diào)用。調(diào)用一個(gè)方法的途徑分三步:1.定義類和類中的方法。2.創(chuàng)建一個(gè)或若干個(gè)實(shí)例,即將類實(shí)例化。3.用所創(chuàng)建的實(shí)例調(diào)用方法。在Python中,方法定義在類的定義中,但只能被類對(duì)象的實(shí)例【實(shí)例6-11】類的定義與實(shí)例化。
classMyClass:
"""一個(gè)簡(jiǎn)單的類實(shí)例"""
i=12
deff(self):
return'helloworld'
#實(shí)例化類
MyClass=MyClass()
#訪問類的屬性和方法
print("MyClass類的屬性i為:",MyClass.i)
print("MyClass類的方法f輸出為:",MyClass.f())
【實(shí)例6-11】類的定義與實(shí)例化。
classMyClas本例中,MyClass.i和MyClass.f()是有效的屬性引用,分別返回一個(gè)整數(shù)和一個(gè)方法對(duì)象。也可以對(duì)類屬性賦值,即可以通過給MyClass.i賦值來修改它。如:
MyClass.i=56
print("修改后MyClass類的屬性i為:",MyClass.i)
本例中,MyClass.i和MyClass.f()是有效的屬類的實(shí)例化使用函數(shù)符號(hào),只要將類對(duì)象看作是一個(gè)返回新的類實(shí)例的無參數(shù)函數(shù)即可。例如(假設(shè)沿用前面的類):
MyClass=MyClass()
該語句創(chuàng)建了一個(gè)新的類實(shí)例(對(duì)象),并將該對(duì)象賦給局部變量MyClass。通過實(shí)例化操作(“調(diào)用”一個(gè)類對(duì)象)來創(chuàng)建一個(gè)空的對(duì)象時(shí),通常會(huì)把這個(gè)新建的實(shí)例賦給一個(gè)變量。賦值在語法上不是必須的,但如果不把這個(gè)實(shí)例保存到一個(gè)變量中,它就沒有用,會(huì)被垃圾收集器自動(dòng)回收,因?yàn)闆]有任何引用指向這個(gè)實(shí)例。
類的實(shí)例化使用函數(shù)符號(hào),只要將類對(duì)象看作是一個(gè)返回新的類實(shí)例很多類都傾向于創(chuàng)建一個(gè)有初始化狀態(tài)的對(duì)象。因此類可能會(huì)定義一個(gè)名為__init__()的特殊方法(構(gòu)造方法),像下面這樣:
def__init__(self):
self.data=[]很多類都傾向于創(chuàng)建一個(gè)有初始化狀態(tài)的對(duì)象。因此類可能會(huì)定義一當(dāng)類被調(diào)用時(shí),實(shí)例化的第一步就是創(chuàng)建實(shí)例對(duì)象,一旦對(duì)象創(chuàng)建,Python就檢查是否已經(jīng)實(shí)現(xiàn)__init__()方法。默認(rèn)情況下,如果沒有定義(或覆蓋)特殊方法__init__(),對(duì)實(shí)例不會(huì)施加任何特別的操作。任何所需的特定操作,都需要程序員實(shí)現(xiàn)__init__()方法,覆蓋它的默認(rèn)行為。所以在下例中,可以這樣創(chuàng)建一個(gè)新的實(shí)例:
MyClass_1=MyClass()__init__()方法可以有參數(shù)。事實(shí)上,正是通過__init__()方法,參數(shù)被傳遞到類的實(shí)例上。
當(dāng)類被調(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類的屬性有兩種有效的屬性名:數(shù)據(jù)屬性和特殊類屬性。1.數(shù)據(jù)屬性
這相當(dāng)于Smalltalk中的“實(shí)例變量”或C++中的“數(shù)據(jù)成員”。和局部變量一樣,數(shù)據(jù)屬性不需要聲明,第一次使用時(shí)它們就會(huì)生成。
6.2.2類的屬性【實(shí)例6-13】數(shù)據(jù)屬性說明。
classfoo(object):
f=100
print(foo.f)
print(foo.f+1)
【實(shí)例6-13】數(shù)據(jù)屬性說明。
classfoo(obje2.特殊類屬性
對(duì)任何類foo,類foo的部分特殊屬性如表6-2所示。
2.特殊類屬性
對(duì)任何類foo,類foo的部分特殊屬性如表6表6-2特殊類屬性類屬性類屬性說明foo.__name__類foo的名字(字符串)foo.__doc__類foo的文檔字符串foo.__bases__類foo的所有父類構(gòu)成的元組foo.__dict__類foo的屬性foo.__module__類foo定義所在的模塊foo.__class__實(shí)例foo對(duì)應(yīng)的類表6-2特殊類屬
【實(shí)例6-14】類屬性說明。
classMyClass(object):
"""MyClass類定義"""
myVer='3.4'
defshowMyVer(self):
print(MyClass.myVer)
print(di
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)管理咨詢顧問服務(wù)協(xié)議合同
- 全新商鋪承租權(quán)轉(zhuǎn)讓合同
- 二零二五版電子商務(wù)推廣合同
- 人員運(yùn)送服務(wù)合同標(biāo)準(zhǔn)文本
- 中燃合作合同標(biāo)準(zhǔn)文本
- 供需延期合同樣本
- 供熱費(fèi)電子合同標(biāo)準(zhǔn)文本
- 產(chǎn)地貨源直供合同標(biāo)準(zhǔn)文本
- 教育學(xué)原理馬工程教材
- ktv運(yùn)營(yíng)合同樣本
- 墻面裱糊工程施工方案及工藝方法
- 核電廠安全核電廠安全設(shè)計(jì)
- 北京大學(xué)數(shù)字圖像處理(岡薩雷斯)通用課件
- 電解質(zhì)分析儀MI操作規(guī)程 sop
- 常用酶切位點(diǎn)表含保護(hù)堿基
- 男性生育報(bào)銷女方未就業(yè)證明(共1頁)
- 彩鋼棚施工方案
- 公文收發(fā)文登記表
- 熱固板施工方案
- 第四次工業(yè)革命
- 年產(chǎn)8萬噸銅帶車間工藝設(shè)計(jì)設(shè)計(jì)0666299
評(píng)論
0/150
提交評(píng)論