- 論壇徽章:
- 0
|
使用from module import 導(dǎo)入模塊python有兩種導(dǎo)入模塊的方法。import module, from module import.from module import基本語(yǔ)法from UserDict import UserDict他與import module很類(lèi)似,但是有一個(gè)重要區(qū)別:UserDict被直接導(dǎo)入到局部名字空間去了,所以他可以直接使用,而不需要加入文件名的限制.>>> import types>>> types.FunctionType 1 >>> FunctionType 2Traceback (innermost last):File "", line 1, in ?NameError: There is no variable named 'FunctionType'>>> from types import FunctionType 3>>> FunctionType 41 模塊不包含方法,只表示每種python對(duì)象名字的屬性.這個(gè)屬性必須用模塊名types進(jìn)行限定.2 FunctionType沒(méi)有存在當(dāng)前名字空間,只存在于type上下文中.3 這個(gè)語(yǔ)法直接從type上下文中將FunctionType屬性導(dǎo)入到局部名字空間中.4 現(xiàn)在Function可以直接使用,于type無(wú)關(guān).
類(lèi)的定義python是完全面向?qū)ο蟮,你可以定義自己的類(lèi),也可以從自己的或者內(nèi)置的類(lèi)繼承,然后從你定義的類(lèi)創(chuàng)建實(shí)例。python以保留字class開(kāi)始,后面跟著類(lèi)名。
class Loaf: pass類(lèi)名第一個(gè)字母一般大寫(xiě)。pass相當(dāng)于C中的{},在類(lèi)中的所有東西都要縮進(jìn),第一條不縮進(jìn)的不屬于這個(gè)類(lèi)。from UserDict import UserDictclass Fileinfo(UserDict):在python中,類(lèi)的基類(lèi)只是簡(jiǎn)單的列在類(lèi)名后面的小括號(hào)里面。所以Fileinfo類(lèi)是從UserDict中繼承來(lái)的。python支持多重繼承,在類(lèi)名后面的小括號(hào)中,你可以列出你想要的列名,以逗號(hào)隔開(kāi)。python必須調(diào)用父類(lèi)中的合適方法。__init__沒(méi)有返回值。
class FileInfo(UserDict): "store file metadata" def __init__(self, filename=None): self指向新創(chuàng)建的對(duì)象,在其他的類(lèi)方法中,它指向方法被調(diào)用的類(lèi)實(shí)例。當(dāng)定義方法時(shí)候你要明確指定self,但是調(diào)用時(shí)候不用指定。__init__方法可以接受任意數(shù)目的參數(shù),就像函數(shù)一樣,參數(shù)可以用缺省值定義。
class FileInfo(UserDict): "store file metadata" def __init__(self, filename=None): UserDict.__init__(self) 1 self["name"] = filename1 一些偽面向?qū)ο笳Z(yǔ)言,父類(lèi)的方法在子類(lèi)的方法執(zhí)行之前被自動(dòng)調(diào)用。python不是這樣,你必須顯示的調(diào)用在父類(lèi)中的合適方法。
了解何時(shí)使用self和__init__當(dāng)定義自己的類(lèi)方法時(shí),你必須明確將self作為每個(gè)方法的第一個(gè)參數(shù)列出,包括__init__。當(dāng)從你的類(lèi)中調(diào)用父類(lèi)時(shí)候,你必須包括self參數(shù)。當(dāng)你從外部調(diào)用你的類(lèi)時(shí)候,不用對(duì)self指定任何值。在python中對(duì)類(lèi)進(jìn)行實(shí)例化華很直接。要對(duì)類(lèi)進(jìn)行實(shí)例化,只要調(diào)用類(lèi),傳入定義在__init__方法中的參數(shù)。返回值將是新創(chuàng)建的對(duì)象。__init__方法__init__方法是可選的,一旦你定義了就必須記得顯示調(diào)用父類(lèi)的__init__方法。無(wú)論何時(shí)子類(lèi)想擴(kuò)展父類(lèi)的行為,后代方法必須在適當(dāng)時(shí)機(jī),使用適當(dāng)參數(shù),顯式調(diào)用父類(lèi)方法。類(lèi)的實(shí)例化>>> import fileinfo>>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3")>>> f.__class__>>> f.__doc__'store file metadata'>>> f{'name': '/music/_singles/kairo.mp3'}你正在創(chuàng)建FileInfo的實(shí)例,并且將新創(chuàng)建的實(shí)例賦值給f,你傳入了1個(gè)參數(shù),他將作為最后在FileInfo中__init__方法中的filename參數(shù)。每一個(gè)類(lèi)的實(shí)例有一個(gè)內(nèi)置屬性,__class__,他是對(duì)象的類(lèi)。
垃圾回收如果說(shuō)創(chuàng)建一個(gè)新的實(shí)例是容易的,那么銷(xiāo)毀他甚至更容易。當(dāng)指派給他們的變量超出作用區(qū)域時(shí)候,他們會(huì)自動(dòng)的釋放,內(nèi)存泄露在python中很少見(jiàn)。
探索UserDict : 一個(gè)封裝類(lèi)
專(zhuān)用類(lèi)方法:__getitem__方法__setitem__方法
高級(jí)專(zhuān)用類(lèi)方法__repr__返回一個(gè)對(duì)象的字符串表示,在交互式窗口中,當(dāng)你只敲入變量名,然后按enter,他能顯示變量值。__cmp__在比較類(lèi)實(shí)例時(shí)候被調(diào)用。用于比較。__len__在調(diào)用len(instance)時(shí)被調(diào)用。len是一個(gè)內(nèi)置函數(shù),可以返回一個(gè)對(duì)象的長(zhǎng)度。__delitem__在調(diào)用del instance[key]時(shí)調(diào)用,你可能記得他作為從字典中刪除的方法。
類(lèi)屬性介紹class MP3FileInfo(FileInfo): "store ID3v1.0 MP3 tags" tagDataMap = {"title" : ( 3, 33, stripnulls), "artist" : ( 33, 63, stripnulls), "album" : ( 63, 93, stripnulls), "year" : ( 93, 97, stripnulls), "comment" : ( 97, 126, stripnulls), "genre" : (127, 128, ord)}>>> import fileinfo>>> fileinfo.MP3FileInfo>>> fileinfo.MP3FileInfo.tagDataMap{'title': (3, 33, ),'genre': (127, 128, ),'artist': (33, 63, ),'year': (93, 97, ),'comment': (97, 126, ),'album': (63, 93, )}
私有函數(shù)私有函數(shù)不可以從他們的模塊外面被調(diào)用。私有類(lèi)方法不能夠從他們的類(lèi)外面被調(diào)用。私有屬性不能夠從他們的類(lèi)外面被訪問(wèn)。如果一個(gè)python函數(shù),類(lèi)方法,或?qū)傩缘拿忠詢(xún)蓚(gè)下劃線開(kāi)始(但不是結(jié)束),他是似有的;其他所有的都是公有的。python沒(méi)有類(lèi)方法保護(hù)的概念(只能用于他們自己的類(lèi)和子類(lèi)中)。
本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u3/103763/showart_2109337.html |
|