python中定义类
3.2. 定義類
Python是完全面向?qū)ο蟮?#xff1a;可以定義自已的類,從自已的或內(nèi)置類進(jìn)行繼承,然后對(duì)生成的類進(jìn)行實(shí)例化。
在Python中定義類很簡(jiǎn)單;就象定義函數(shù),沒有獨(dú)立的定義接口。只要定義類,然后編碼就可以了。Python類以保留字 class 開始,跟著是類的名字。從技術(shù)上說(shuō),有這些就足夠了,因?yàn)橐粋€(gè)類不需要從任何其它類繼承而來(lái)。
例 3.3. 最簡(jiǎn)單的Python類
class foo: pass| 這個(gè)類的名字是 foo,它沒有從任何其它的類繼承而來(lái)。 | |
| 這個(gè)類沒有定義任何方法或?qū)傩?#xff0c;但是從語(yǔ)法上,需要在定義中有些東西,所以我們使用了 pass。這是一個(gè)Python保留字,僅僅表示“向前走,不要往這看”。它相當(dāng)于C++中的大括號(hào)空集({})或者是Java中的單個(gè)分號(hào)。它是一條什么都不做的語(yǔ)句,當(dāng)你刪除函數(shù)或類時(shí),它是一個(gè)很好的占位符。 | |
| 你可能猜到了,在類中的每條語(yǔ)句都是縮排的,就象函數(shù)內(nèi)的代碼, if 語(yǔ)句, for 循環(huán),等等。第一條不縮近的語(yǔ)句不屬于這個(gè)類。 |
當(dāng)然,實(shí)際上大多數(shù)的類將從其它的類繼承來(lái)的,并且它們將定義自已的類方法和屬性。但是如你所見,除了名字以外,沒有什么東西是一個(gè)類必須擁有的。特別是,C++程序員可能會(huì)感到奇怪,Python的類沒有明確的構(gòu)造器和析構(gòu)器。Python類的確存在同一個(gè)構(gòu)造器相似的東西: __init__ 方法。
例 3.4. 定義 FileInfo 類
from UserDict import UserDict class FileInfo(UserDict): "store file metadata" def __init__(self, filename=None): UserDict.__init__(self) self["name"] = filename| 類的祖先被列在立即跟在類名字后面的小括號(hào)里。所以 FileInfo 類是從 UserDict 類(這個(gè)類從 UserDict 中導(dǎo)入)繼承而來(lái)。UserDict 是一個(gè)象字典一樣動(dòng)作的類,它允許你完全子類化字典數(shù)據(jù)類型,同時(shí)增加你自已的行為。(也存在相似的類 UserList 和 UserString ,它們?cè)试S你子類化列表和字符串。)在這個(gè)類的背后有一些“巫術(shù)”,我們將在本章的后面,隨著更進(jìn)一步地研究 UserDict 類,揭開這些秘密。 | |
| 類也可以有文檔字符串,就象模塊和函數(shù)。 | |
| __init__ 在類的實(shí)例創(chuàng)建后立即被調(diào)用。它可能會(huì)誘使你,但是不正確地,叫它為類的構(gòu)造器。說(shuō)它誘使,是因?yàn)樗瓷先ハ髽?gòu)造器(按照習(xí)慣, __init__ 是類中第一個(gè)定義的方法),象構(gòu)造器一樣動(dòng)作(在一個(gè)新創(chuàng)建的類實(shí)例中,它是首先被執(zhí)行的代碼),并且聽起來(lái)也象構(gòu)造器(“init”當(dāng)然意味著構(gòu)造的本性)。說(shuō)它不正確,是因?yàn)閷?duì)象在 __init__ 被調(diào)用的時(shí)刻已經(jīng)被構(gòu)造出來(lái)了,你已經(jīng)有了對(duì)類的新實(shí)例一個(gè)有效的引用。 | |
| 每一個(gè)類方法的第一個(gè)參數(shù),包括 __init__,總是指向類的當(dāng)前實(shí)例的一個(gè)引用。按照習(xí)慣這個(gè)參數(shù)被命名為 self。(除了 self 不要把它命名為別的東西,這是一個(gè)非常強(qiáng)烈的習(xí)慣。) self 象C++中的保留字 this。在 __init__ 方法中, self 指向新創(chuàng)建的對(duì)象;在其它的方法中,它指向方法被調(diào)用的對(duì)象。 | |
| __init__ 方法可以接受任意個(gè)數(shù)的參數(shù),就象函數(shù)一樣,參數(shù)可以用缺省值定義,可以設(shè)置成對(duì)于調(diào)用者可選。在本例中, name 有一個(gè)缺省值 None,即Python的空值。 | |
| 一些偽面向?qū)ο笳Z(yǔ)言,象Powerbuilder有一種“擴(kuò)展”構(gòu)造器和其它事件的概念,即父類的方法在子類的方法執(zhí)行前被自動(dòng)調(diào)用。Python不這樣做,你必須總是顯示調(diào)用在父類中適合的方法。同樣,當(dāng)調(diào)用父類方法時(shí),你必須包含 self 參數(shù),跟著類方法所接受的任何其它類型。在本例中,我們沒有使用參數(shù)(除了 self)調(diào)用 UserDict 類的 __init__ 方法。 | |
| 我對(duì)你說(shuō)過(guò),這個(gè)類的象字典一樣動(dòng)作,那么這里就是第一個(gè)印象。我們將參數(shù) filename 賦值給對(duì)象 name 關(guān)鍵字,作為它的值。 | |
| 注意 __init__ 方法從不返回一個(gè)值。 |
噢。我知道有很多知識(shí)需要吸收,但是你要掌握它。所有的Python類以相同的方式工作,所以一旦你學(xué)會(huì)了一個(gè),就是學(xué)會(huì)了全部。再加上,在Python社區(qū)中有強(qiáng)烈的習(xí)慣,對(duì)于每個(gè)類方法的第一個(gè)參數(shù)都命名為“self”,所以你不會(huì)浪費(fèi)大量時(shí)間去習(xí)慣他人的風(fēng)格。如果你忘了別的任何事,也要記住這件事,因?yàn)槲艺J(rèn)定它會(huì)讓你出錯(cuò):
| __init__ 方法是可選的,但是一旦你定義了一個(gè),就必須記得顯示調(diào)用父類的 __init__ 方法。這樣更是正確的:何時(shí)一個(gè)子類想擴(kuò)展父類的行為,后代方法必須在適當(dāng)?shù)臅r(shí)機(jī),使用適當(dāng)?shù)膮?shù),顯式調(diào)用父類方法。 | |
轉(zhuǎn)載于:https://www.cnblogs.com/starspace/archive/2008/12/11/1353231.html
總結(jié)
以上是生活随笔為你收集整理的python中定义类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 用vs2005 开发arcims htm
- 下一篇: Python之中文识别