欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python面向?qū)ο蟪绦蛟O(shè)計(jì)OOP入門教程【類,實(shí)例,繼承,重載等】

 更新時(shí)間:2019年01月05日 12:01:08   作者:KLeonard  
這篇文章主要介紹了Python面向?qū)ο蟪绦蛟O(shè)計(jì)OOP入門教程,較為詳細(xì)的分析了Python面向?qū)ο箢?實(shí)例,繼承,重載等相關(guān)概念與使用技巧,需要的朋友可以參考下

本文實(shí)例講述了Python面向?qū)ο蟪绦蛟O(shè)計(jì)OOP。分享給大家供大家參考,具體如下:

類是Python所提供的最有用的的工具之一。合理使用時(shí),類可以大量減少開發(fā)的時(shí)間。類也在流行的Python工具中使用,例如,tkinter GUI API。

為何使用類

與面向?qū)ο蟮腏ava一樣,類是對(duì)現(xiàn)實(shí)世界的一種抽象。

從更具體的程序設(shè)計(jì)觀點(diǎn)來看,類是Python的程序組成單元,就像函數(shù)和模塊一樣:類是封裝邏輯和數(shù)據(jù)的另一種方式。實(shí)際上,類也定義新的命名空間,在很大程度上就像模塊。但是類有三個(gè)重要的獨(dú)到之處,使其在建立對(duì)象時(shí)更為有用。

1.多重實(shí)例

類基本上就是產(chǎn)生對(duì)象的工廠。每次調(diào)用一個(gè)類,就會(huì)產(chǎn)生一個(gè)有獨(dú)立命名空間的新對(duì)象。每個(gè)又類產(chǎn)生的對(duì)象都能讀取類的屬性,并獲得自己的命名空間來儲(chǔ)存數(shù)據(jù),這些數(shù)據(jù)對(duì)于每個(gè)對(duì)象來說都不同。

2.通過繼承進(jìn)行定制

類也支持OOP的繼承的概念。我們可以在類的外部重新定義其屬性從而擴(kuò)充這個(gè)類。

3.運(yùn)算符重載

通過提供特定的協(xié)議方法,類可以定義對(duì)象來響應(yīng)在內(nèi)置類型上的幾種運(yùn)算。例如,通過類創(chuàng)建的對(duì)象可以進(jìn)行切片,級(jí)聯(lián)和索引等運(yùn)算。Python提供了一些可以由類使用的鉤子,從而能夠中斷并實(shí)現(xiàn)任何的內(nèi)置類型運(yùn)算。

Python的類與Java類似,所以關(guān)于繼承、屬性和方法以及類和實(shí)例的基礎(chǔ)知識(shí)在這里不再贅述。直接介紹語(yǔ)法內(nèi)容。

類產(chǎn)生多個(gè)實(shí)例對(duì)象

【OOP模型中的兩種對(duì)象:類對(duì)象和實(shí)例對(duì)象】

類對(duì)象提供默認(rèn)行為,是實(shí)例對(duì)象的工廠。實(shí)例對(duì)象是程序處理的實(shí)際對(duì)象:各自都有獨(dú)立的命名空間,但是繼承(可自動(dòng)存取)創(chuàng)建該實(shí)例的類中的變量名。類對(duì)象來自于語(yǔ)句,而實(shí)例來自于調(diào)用。每次調(diào)用一個(gè)類,就會(huì)得到這個(gè)類的新的實(shí)例。

【類對(duì)象提供默認(rèn)行為】

執(zhí)行class語(yǔ)句,就會(huì)得到類對(duì)象。以下是Python類的主要特性:
1.class語(yǔ)句創(chuàng)建類對(duì)象并將其賦值給變量名。就像函數(shù)def語(yǔ)句,Python class語(yǔ)句也是可執(zhí)行語(yǔ)句,執(zhí)行時(shí),會(huì)產(chǎn)生新的類對(duì)象,并將其賦值給class頭部的變量名。此外,就像def應(yīng)用,class語(yǔ)句一般是在其所在文件導(dǎo)入時(shí)執(zhí)行的。

2.class語(yǔ)句內(nèi)的賦值語(yǔ)句會(huì)創(chuàng)建類的屬性。class語(yǔ)句內(nèi)的頂層的賦值語(yǔ)句會(huì)產(chǎn)生類對(duì)象中的屬性。從技術(shù)角度講,class語(yǔ)句的作用域會(huì)變成類對(duì)象的屬性的命名空間,就像模塊的全局作用域一樣。執(zhí)行class語(yǔ)句后,類的屬性可由變量名點(diǎn)號(hào)運(yùn)算獲取object.name。

3.類屬性提供對(duì)象的狀態(tài)和行為。類對(duì)象的屬性記錄狀態(tài)信息和行為,可由這個(gè)類創(chuàng)建的所有實(shí)例共享。位于類中的函數(shù)def語(yǔ)句會(huì)生成方法,方法將會(huì)處理實(shí)例。

【實(shí)例對(duì)象是具體元素】

當(dāng)調(diào)用類對(duì)象時(shí),我們得到了實(shí)例對(duì)象。以下是類的實(shí)例內(nèi)含的重點(diǎn)概要。

1.像函數(shù)那樣調(diào)用類對(duì)象會(huì)創(chuàng)建新的實(shí)例對(duì)象。實(shí)例代表了程序領(lǐng)域中的具體元素。

2.每個(gè)實(shí)例對(duì)象繼承類的屬性并獲得了自己的命名空間。由類所創(chuàng)建的實(shí)例對(duì)象是新的命名空間。一開始是空的,但是會(huì)繼承創(chuàng)建該實(shí)例的類對(duì)象內(nèi)的屬性。

3.在方法內(nèi)對(duì)self屬性做賦值運(yùn)算會(huì)產(chǎn)生每個(gè)實(shí)例自己的屬性。在類方法函數(shù)內(nèi),第一個(gè)參數(shù)(self)會(huì)引用正處理的實(shí)例對(duì)象。對(duì)self的屬性做賦值運(yùn)算,會(huì)創(chuàng)建或修改實(shí)例內(nèi)的數(shù)據(jù),而不是類的數(shù)據(jù)。

第一個(gè)例子

首先定義一個(gè)名為FirstClass的類,通過交互模式運(yùn)行Python class 語(yǔ)句。

>>> class FirstClass:
 def setdata(self,value):
 self.data = value
 def display(self):
 print(self.data)

這里是在交互模式下工作,但一般來說,這種語(yǔ)句應(yīng)該是當(dāng)其所在的模塊文件導(dǎo)入時(shí)運(yùn)行的。就像通過def建立的函數(shù),這個(gè)類在Python抵達(dá)并執(zhí)行語(yǔ)句前是不會(huì)存在的。

就像所有的復(fù)合語(yǔ)句一樣,class開頭一行會(huì)列出類的名稱,后面再接一個(gè)或多個(gè)內(nèi)嵌并且縮進(jìn)的語(yǔ)句的主體。

就像之前學(xué)過的,def其實(shí)是賦值運(yùn)算。在這里把函數(shù)對(duì)象賦值給變量名setdata,而display位于class語(yǔ)句范圍內(nèi),因此會(huì)產(chǎn)生附加在類上的屬性:FirstClass.setdataFirstClass.display。事實(shí)上,在類嵌套的代碼塊中頂層的賦值的任何變量名,都會(huì)變成類的屬性。

位于類中的函數(shù)通常稱為方法。方法時(shí)普通def,支持先去學(xué)過的函數(shù)的所有內(nèi)容。在方法函數(shù)中,調(diào)用時(shí),第一個(gè)參數(shù)(self)自動(dòng)接收隱含的實(shí)例對(duì)象:調(diào)用的主體。下面建立這個(gè)類兩個(gè)實(shí)例:

>>> x = FirstClass()
>>> y = FirstClass()

以此方式調(diào)用類時(shí),【注意后面有小括號(hào)】,會(huì)產(chǎn)生實(shí)例對(duì)象。確切的講,此時(shí)有三個(gè)對(duì)象:兩個(gè)實(shí)例和一個(gè)類。

這兩個(gè)實(shí)例一開始是空的,但是它們被連接到創(chuàng)建它們的類。如果對(duì)實(shí)例以及類對(duì)象內(nèi)的屬性名稱進(jìn)行點(diǎn)號(hào)運(yùn)算,Python會(huì)通過繼承搜索從類取得變量名。

>>> x.setdata('King Arthur')
>>> y.setdata(3.14159)

x或y本身都沒有setdata屬性,為了尋找這個(gè)屬性,Python會(huì)順著實(shí)例到類的連接搜索。而這就是所謂的Python的繼承:繼承是在屬性點(diǎn)號(hào)運(yùn)算時(shí)發(fā)生的,而且只與查找連接對(duì)象內(nèi)的變量名有關(guān)。

在FirstClass的setdata函數(shù)中,傳入的值會(huì)賦給self.data。在方法中,self(按慣例,這是最左側(cè)參數(shù)的名稱)會(huì)自動(dòng)引用正在處理的實(shí)例(x或y),所以賦值語(yǔ)句會(huì)把值儲(chǔ)存在實(shí)例的命名空間,而不是類的命名空間。

因?yàn)轭悤?huì)產(chǎn)生多個(gè)實(shí)例,方法必須經(jīng)過self參數(shù)才能獲取正在處理的實(shí)例。當(dāng)調(diào)用類的display方法來打印self.data時(shí),會(huì)發(fā)現(xiàn)每個(gè)實(shí)例的值都不同。另外,變量名display在x和y之內(nèi)都相同,因?yàn)樗莵碜杂陬惖模?/p>

>>> x.display()
King Arthur
>>> y.display()
3.14159

注意:在每個(gè)實(shí)例內(nèi)的data成員儲(chǔ)存了不同對(duì)象類型(字符串和浮點(diǎn)數(shù))。就像Python中的其他事物,實(shí)例屬性并沒有聲明。首次賦值后,實(shí)例就會(huì)存在,就像簡(jiǎn)單的變量。事實(shí)上,如果在調(diào)用setdata之前,就對(duì)某一實(shí)例調(diào)用display,則會(huì)觸發(fā)未定義變量名的錯(cuò)誤:data屬性以setdata方法賦值前,是不會(huì)在內(nèi)存中存在的。

我們可以在類的內(nèi)部或外部修改實(shí)例屬性。在類內(nèi)時(shí),通過方法對(duì)self進(jìn)行賦值運(yùn)算,而在類外時(shí),則可以通過對(duì)實(shí)例對(duì)象進(jìn)行賦值運(yùn)算:

>>> x.data = 'New value'
>>> x.display()
New value

雖然比較少見,通過在類方法函數(shù)外對(duì)變量名進(jìn)行賦值運(yùn)算,我們甚至可以在實(shí)例命名空間內(nèi)產(chǎn)生全新的屬性:

>>> x.anothername = 'spam'

這里會(huì)增加一個(gè)名為anothername的新屬性,實(shí)例對(duì)象x的任何類方法都可以使用它。

不過,類通常是通過self參數(shù)進(jìn)行賦值運(yùn)算從而建立實(shí)例的所有屬性的。

類通過繼承進(jìn)行定制

除了作為工廠來生成多個(gè)實(shí)例對(duì)象之外,類也可以引入新組件(子類)來進(jìn)行修改,而不對(duì)現(xiàn)有組件進(jìn)行原地的修改。由類產(chǎn)生的實(shí)例對(duì)象會(huì)繼承該類的屬性。

在Python中,實(shí)例從類中繼承,而類繼承于超類。以下是屬性繼承機(jī)制的核心觀點(diǎn):

1.超類列在了類開頭的括號(hào)中。含有繼承的類稱為子類,而子類所繼承的類就是其超類。

2.類從其超類中繼承屬性。就像實(shí)例繼承其類中所定義的屬性名一樣,類也會(huì)繼承其超類中定義的所有屬性名稱。當(dāng)讀取屬性時(shí),如果它不存在于子類中,Python會(huì)自動(dòng)搜索這個(gè)屬性。

3.每個(gè)object.attribute都會(huì)開啟新的獨(dú)立搜索。

4.邏輯的修改是通過創(chuàng)建子類,而不是修改超類。在樹中層次較低的子類中重新定義超類的變量名,子類就可以取代并定制所繼承的行為。

第二個(gè)例子

下個(gè)例子建立在上一個(gè)例子的基礎(chǔ)之上。首先,定義一個(gè)新的類SecondClass,繼承FirstClass所有變量名,并提供自己的一個(gè)變量名。

>>> class secondClass(FirstClass):
 def display(self):
 print('Current value = " %s "'%self.data)

SecondClass定義display方法以不同格式打印。定義一個(gè)和FirstClass中的屬性同名的屬性,SecondClass有效地取代其超類內(nèi)的display屬性。因?yàn)槔^承搜索會(huì)從實(shí)例向上進(jìn)行,之后到子類,然后到超類,直到所找到的屬性名稱首次出現(xiàn)為止。

有時(shí)候,我們把這種在樹中較低處發(fā)生的重新定義的、取代屬性的動(dòng)作稱為【重載】。結(jié)果就是,SecondClass改變了display的行為,把FirstClass特定化了。另外,SecondClass(以及其任何實(shí)例)依然會(huì)繼承FirstClass的setdata方法:

>>> z = SecondClass()
>>> z.setdata(42)
>>> z.display()
Current value = " 42 "

這里有一個(gè)和OOP相關(guān)的很重要的事情要留意:SecondClass引入的專有化完全是在FirstClass外部完成的。也就是說,不影響當(dāng)前存在的或未來的FirstClass對(duì)象,就像上一個(gè)例子中的x:

>>> x.display()
New value

類是模塊內(nèi)的屬性

類的名稱沒有什么神奇之處。當(dāng)class語(yǔ)句執(zhí)行時(shí),這只是賦值給對(duì)象的變量,而對(duì)象可以用任何普通表達(dá)式引用。

例如,如果FirstClass是寫在模塊文件內(nèi),而不是在交互模式下輸入的,就可將其導(dǎo)入,在類開頭的那行可以正常地使用它的名稱。

from modulename import FirstClass
class SecondClass(FirstClass):
 def display(self):...

或者,其等效寫法:

import modulename
class SecondClass(module.FirstClass):
 def display():...

像其他事物一樣,類名稱總是存在于模塊中。每個(gè)模塊可以任意混合任意數(shù)量的變量、函數(shù)以及類。文件food.py示例如下:

#food.py
var = 1
def func():
 ...
class spam:
 ...
class ham:
 ...
class eggs:
 ...

如果模塊和類碰巧有相同的名稱,也是如此。文件person.py,寫法如下:

class person:
 ...

需要像往常一樣通過模塊獲取類:

import person
x = person.person()

person.person()指的是person模塊內(nèi)的person類。只寫person只會(huì)取得模塊,而不是類,除非使用from語(yǔ)句。

from person import person
x = person()

Python的通用慣例之處,類名應(yīng)該以一個(gè)大寫字母開頭,以使得他們更為清晰:

import person
x = person.Person()

類可以截獲Python運(yùn)算符:運(yùn)算符重載

運(yùn)算符重載就是讓類寫成的對(duì)象,可以截獲并響應(yīng)用在內(nèi)置類型上的運(yùn)算:加法、切片、打印和點(diǎn)號(hào)運(yùn)算等。

因?yàn)檫\(yùn)算符重載,可以讓我們自己的對(duì)象行為就像內(nèi)置對(duì)象那樣,這可促進(jìn)對(duì)象接口更為一致并更易于學(xué)習(xí),而且可讓類對(duì)象由預(yù)期的內(nèi)置類型接口的代碼處理。以下是重載運(yùn)算符主要概念的概要:

1.以雙下劃線命名的方法(__X__)是特殊鉤子。Python運(yùn)算符重載的實(shí)現(xiàn)是提供特殊命名的方法來攔截運(yùn)算。Python語(yǔ)言替每種運(yùn)算和特殊命名的方法之間,定義了固定不變的映射關(guān)系。

2.當(dāng)實(shí)例出現(xiàn)在內(nèi)置運(yùn)算時(shí),這類方法會(huì)自動(dòng)調(diào)用。例如,如果實(shí)例對(duì)象繼承了__add__方法,當(dāng)對(duì)象出現(xiàn)在+表達(dá)式內(nèi)時(shí),該方法就會(huì)調(diào)用。該方法的返回值變成相應(yīng)表達(dá)式的結(jié)果。

3.類可覆蓋多數(shù)內(nèi)置類型運(yùn)算。有幾十種特殊運(yùn)算符重載的方法的名稱,幾乎可以截獲并實(shí)現(xiàn)內(nèi)置類型的所有運(yùn)算。它不僅包括了表達(dá)式,而且像打印和對(duì)象建立這類基本運(yùn)算也包括在內(nèi)。

4.運(yùn)算符覆蓋方法沒有默認(rèn)值,而且也不需要。如果類沒有定義或繼承運(yùn)算符重載方法,就是說相應(yīng)的運(yùn)算在類實(shí)例中并不支持。例如,如果沒有__add__,+表達(dá)式就會(huì)引發(fā)異常。

5.運(yùn)算符可讓類與Python的對(duì)象模型相集成。

【不過,要注意的是,運(yùn)算符重載是可選的功能,一般的應(yīng)用程序開發(fā)并不需要,除非真的有特殊的需求需要模仿內(nèi)置類型接口?!?/p>

第三個(gè)例子

這一次,要定義SecondClass的子類,實(shí)現(xiàn)三個(gè)特殊名稱的屬性,讓Python自動(dòng)進(jìn)行調(diào)用:

1.當(dāng)新的實(shí)例構(gòu)造時(shí),會(huì)調(diào)用__init__(self是新的ThirdClass對(duì)象)
2.當(dāng)ThirdClass實(shí)例出現(xiàn)在+表達(dá)式中時(shí),則會(huì)調(diào)用__add__。
3.當(dāng)打印一個(gè)對(duì)象的時(shí)候(從技術(shù)上講,當(dāng)通過str內(nèi)置函數(shù)或者其Python內(nèi)部的等價(jià)形式來將其轉(zhuǎn)換為打印字符串的時(shí)候),運(yùn)行__str__

新的子類也定義了一個(gè)常規(guī)命名的方法,叫做mul,它在原處修改該實(shí)例的對(duì)象。如下是一個(gè)新的子類:

>>> class ThirdClass(SecondClass):
 def __init__(self,value):
 self.data = value
 def __add__(self,other):
 return ThirdClass(self.data+other)
 def __str__(self):
 return '[ThirdClass:%s]'%self.data
 def mul(self,other):
 self.data*=other
>>>
>>> a = ThirdClass('abc')
>>> a.display()
Current value = " abc "
>>> print(a)
[ThirdClass:abc]
>>> b = a + 'xyz'
>>> b.display()
Current value = " abcxyz "
>>> a.mul(3)
>>> print(a)
[ThirdClass:abcabcabc]

ThirdClass是一個(gè)SecondClass對(duì)象,所以其實(shí)例會(huì)繼承SecondClass的display方法。但是,ThirdClass生成的調(diào)用現(xiàn)在會(huì)傳遞一個(gè)參數(shù)(例如,‘a(chǎn)bc'),這是傳給__init__構(gòu)造函數(shù)內(nèi)的參數(shù)value的,并將其值賦給self.data。直接效果就是,ThirdClass計(jì)劃在構(gòu)建時(shí)自動(dòng)設(shè)置data屬性,而不是在構(gòu)建之后請(qǐng)求setdata調(diào)用。

此外,ThirdClass對(duì)象現(xiàn)在可以出現(xiàn)在+表達(dá)式和print調(diào)用中。對(duì)于+,Python把左側(cè)的實(shí)例對(duì)象傳給__add__中的self參數(shù),而把右邊的值傳給other。__add__返回的內(nèi)容成為+表達(dá)式的結(jié)果。對(duì)于print,Python把要打印的對(duì)象傳遞給__str__中的self;該方法返回的字符串看作是對(duì)象的打印字符串。使用__str__,我們可以用一個(gè)常規(guī)的print來顯示該類的對(duì)象,而不是調(diào)用特殊的display方法。

__init__、__add__和__str__這樣的特殊命名的方法會(huì)由子類和實(shí)例繼承,就像這個(gè)類中賦值的其他變量名。Python通常會(huì)自動(dòng)調(diào)用,但偶爾也能由程序代碼調(diào)用。

【注意:只有在實(shí)現(xiàn)本質(zhì)為數(shù)學(xué)的對(duì)象時(shí),才會(huì)用到許多運(yùn)算符重載方法。例如,向量或矩陣類可以重載加法運(yùn)算符,但員工類可能就不用。就較簡(jiǎn)單的類而言,可能根本不會(huì)用到重載】

【幾乎每個(gè)實(shí)例的類都會(huì)出現(xiàn)一個(gè)重載方法是:__init__構(gòu)造函數(shù)。雖然Python不會(huì)對(duì)實(shí)例的屬性進(jìn)行聲明,但通常也可以通過找到類的__init__方法的代碼,而了解實(shí)例有哪些屬性。】

注意:Python中沒有Java中的方法重載,即方法名相同,但參數(shù)和參數(shù)類型不同,比如__init__函數(shù)只能有一個(gè),取最后一個(gè)賦給__init__的函數(shù)對(duì)象。

>>> class Test:
 def __init__():
 pass
 def __init__(self,name,age,sex):
 self.name = name
 self.age = age
 self.sex = sex
>>> a = Test()
Traceback (most recent call last):
 File "<pyshell#54>", line 1, in <module>
 a = Test()
TypeError: __init__() missing 3 required positional arguments: 'name', 'age', and 'sex'

把兩個(gè)__init__換了位置之后就沒有報(bào)錯(cuò)了,因?yàn)開_init__函數(shù)已經(jīng)更改成了沒有參數(shù)的:

>>> class Test:
 def __init__(self,name,age,sex):
 self.name = name
 self.age = age
 self.sex = sex
 def __init__(self):
 pass
>>> a = Test()

世界上最簡(jiǎn)單的Python類

實(shí)際上,我們建立的類可以什么東西都沒有,下列語(yǔ)句建立一個(gè)類,其內(nèi)完全沒有附加的屬性:

>>> class rec:pass

因?yàn)闆]有寫任何方法,所以我們需要無(wú)操作的pass語(yǔ)句。以交互模式執(zhí)行此語(yǔ)句,建立這個(gè)類后,就可以完全在最初的class語(yǔ)句外,通過賦值變量名給這個(gè)類增加屬性:

>>> rec.name = 'Bob'
>>> rec.age = 40

通過賦值語(yǔ)句創(chuàng)建這些屬性后,就可以用一般的語(yǔ)法將它們?nèi)〕觥_@樣用時(shí),類差不多就像C的struct,我們也可以用字典的鍵做類似的事情,但是需要額外的字符。

>>> print(rec.name)
Bob

現(xiàn)在建立兩個(gè)該類的實(shí)例:

>>> x = rec()
>>> y = rec()
>>> x.name,y.name
('Bob', 'Bob')

這些實(shí)例本身沒有屬性,它們只是從類對(duì)象那里取出name屬性。不過,如果把一個(gè)屬性賦值給一個(gè)實(shí)例,就會(huì)在該對(duì)象內(nèi)創(chuàng)建(或修改)該屬性,而不會(huì)因?qū)傩缘囊枚鴨?dòng)繼承搜索,因?yàn)閷傩再x值運(yùn)算只會(huì)影響屬性賦值所在的對(duì)象。在這里,x得到自己的name,但y依然繼承附加在他的類上的name:

>>> x.name = 'Gavin'
>>> rec.name,x.name,y.name
('Bob', 'Gavin', 'Bob')

事實(shí)上,命名空間對(duì)象的屬性通常都是以字典的形式實(shí)現(xiàn)的。例如,__dict__屬性是針對(duì)大多數(shù)基于類的對(duì)象的命名空間字典。如下,名稱和__X__內(nèi)部名稱集合所出現(xiàn)的順序可能隨著版本的不同而有所不同:

>>> rec.__dict__.keys()
dict_keys(['__weakref__', 'name', '__module__', '__doc__', 'age', '__dict__'])
>>> list(x.__dict__.keys())
['name']
>>> list(y.__dict__.keys())
[]

在這里,類的字典顯示出我們進(jìn)行賦值了的name和age屬性,x有自己的name,而y依然是空的。不過,每個(gè)實(shí)例都連接至其類以便于繼承,如果你想查看的話,這個(gè)連接叫做__class__:

>>> x.__class__
<class '__main__.rec'>

類也有一個(gè)__bases__屬性,它是其超類的元祖:

>>> rec.__bases__
(<class 'object'>,)

這兩個(gè)屬性時(shí)Python在內(nèi)存中類樹常量的表示方式。

即使是方法也可以完全獨(dú)立地在任意類對(duì)象的外部創(chuàng)建。例如,下列在任意類之外定義了一個(gè)簡(jiǎn)單函數(shù),并帶有一個(gè)參數(shù):

>>> def upperName(self):
return self.name.upper()

這里與類完全沒有什么關(guān)系——這是一個(gè)簡(jiǎn)單函數(shù),在此時(shí)就能予以調(diào)用,只要我們傳入一個(gè)帶有name屬性的對(duì)象:

>>> upperName(x)
'GAVIN'

不過,如果我們把這個(gè)簡(jiǎn)單函數(shù)賦值成類的屬性,就會(huì)變成方法,可以由任何實(shí)例調(diào)用:

>>> rec.method = upperName
>>> x.method()
'GAVIN'
>>> y.method()
'BOB'
>>> rec.method(x)
'GAVIN'

類與字典的關(guān)系

看如下字典的示例:

>>> rec = {}
>>> rec['name'] = 'mel'
>>> rec['age'] = 45
>>> rec['job'] = 'trainer/writer'
>>>
>>> print(rec['name'])
mel

這段代碼模擬了像其他語(yǔ)言中記錄這樣的工具,這里也可以用類做同樣的事情:

>>> class rec:pass
>>> rec.name = 'mel'
>>> rec.age = 45
>>> rec.job = 'trainer/writer'
>>>
>>> print(rec.age)
45

這段代碼的語(yǔ)法比其字典等價(jià)形式要少很多。它使用了一個(gè)空的class語(yǔ)句來產(chǎn)生一個(gè)空的命名空間。

這是有效的,但是,對(duì)于我們將需要的每一條不同的記錄,都需要一條新的class語(yǔ)句。更通俗的講,我們可以產(chǎn)生一個(gè)空類的實(shí)例來表示每條不同的記錄:

>>> class rec:pass
>>> pers1 = rec()
>>> pers1.name='mel'
>>> pers1.job = 'trainer'
>>> pers1.age = 40
>>>
>>> pers2 = rec()
>>> pers2.name = 'vls'
>>> pers2.job = 'developer'
>>>
>>> pers1.name,pers2.name
('mel', 'vls')

這里,我們通過對(duì)屬性賦值來填充記錄,實(shí)際上,同一個(gè)類的實(shí)例甚至不一定必須有相同的一組屬性名稱,在這個(gè)示例中,pers1有唯一的age屬性。每一個(gè)實(shí)例都有一個(gè)不同的屬性字典。

最后,我們可以編寫一個(gè)更完整的類來實(shí)現(xiàn)記錄及處理:

>>> class Person:
 def __init__(self,name,job):
 self.name = name
 self.job = job
 def info(self):
 return (self.name,self.job)
>>> rec1 = Person('mel','trainer')
>>> rec2 = Person('vls','developer')
>>>
>>> rec1.job,rec2.info()
('trainer', ('vls', 'developer'))

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python面向?qū)ο蟪绦蛟O(shè)計(jì)入門與進(jìn)階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門與進(jìn)階經(jīng)典教程

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

最新評(píng)論