<pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
    <pre id="vvttv"></pre>

      <p id="vvttv"></p>

          <p id="vvttv"></p>

                <p id="vvttv"></p>

                <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                  <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                    <p id="vvttv"></p>

                    第 5 章 對象和面向對象

                    這一章,和此后的許多章,均討論了面向對象的 Python 程序設計。

                    5.1. 概覽

                    下面是一個完整的,可運行的 Python 程序。請閱讀模塊、類和函數的 doc strings,可以大概了解這個程序所做的事情和工作情況。像平時一樣,不用擔心你不理解的東西,這就是本章其它部分將告訴你的內容。

                    例 5.1. fileinfo.py

                    如果您還沒有下載本書附帶的樣例程序, 可以 下載本程序和其他樣例程序

                    """Framework for getting filetype-specific metadata.
                    
                    Instantiate appropriate class with filename.  Returned object acts like a
                    dictionary, with key-value pairs for each piece of metadata.
                        import fileinfo
                        info = fileinfo.MP3FileInfo("/music/ap/mahadeva.mp3")
                        print "\\n".join(["%s=%s" % (k, v) for k, v in info.items()])
                    
                    Or use listDirectory function to get info on all files in a directory.
                        for info in fileinfo.listDirectory("/music/ap/", [".mp3"]):
                            ...
                    
                    Framework can be extended by adding classes for particular file types, e.g.
                    HTMLFileInfo, MPGFileInfo, DOCFileInfo.  Each class is completely responsible for
                    parsing its files appropriately; see MP3FileInfo for example.
                    """
                    import os
                    import sys
                    from UserDict import UserDict
                    
                    def stripnulls(data):
                        "strip whitespace and nulls"
                        return data.replace("\00", "").strip()
                    
                    class FileInfo(UserDict):
                        "store file metadata"
                        def __init__(self, filename=None):
                            UserDict.__init__(self)
                            self["name"] = filename
                    
                    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)}
                    
                        def __parse(self, filename):
                            "parse ID3v1.0 tags from MP3 file"
                            self.clear()
                            try:                               
                                fsock = open(filename, "rb", 0)
                                try:                           
                                    fsock.seek(-128, 2)        
                                    tagdata = fsock.read(128)  
                                finally:                       
                                    fsock.close()              
                                if tagdata[:3] == "TAG":
                                    for tag, (start, end, parseFunc) in self.tagDataMap.items():
                                        self[tag] = parseFunc(tagdata[start:end])               
                            except IOError:                    
                                pass                           
                    
                        def __setitem__(self, key, item):
                            if key == "name" and item:
                                self.__parse(item)
                            FileInfo.__setitem__(self, key, item)
                    
                    def listDirectory(directory, fileExtList):                                        
                        "get list of file info objects for files of particular extensions"
                        fileList = [os.path.normcase(f)
                                    for f in os.listdir(directory)]           
                        fileList = [os.path.join(directory, f) 
                                   for f in fileList
                                    if os.path.splitext(f)[1] in fileExtList] 
                        def getFileInfoClass(filename, module=sys.modules[FileInfo.__module__]):      
                            "get file info class from filename extension"                             
                            subclass = "%sFileInfo" % os.path.splitext(filename)[1].upper()[1:]       
                            return hasattr(module, subclass) and getattr(module, subclass) or FileInfo
                        return [getFileInfoClass(f)(f) for f in fileList]                             
                    
                    if __name__ == "__main__":
                        for info in listDirectory("/music/_singles/", [".mp3"]): 1
                            print "\n".join(["%s=%s" % (k, v) for k, v in info.items()])
                            print
                    1 這個程序的輸入要取決于你硬盤上的文件。為了得到有意義的輸出,你應該修改目錄路徑指向你自已機器上的一個 MP3 文件目錄。

                    下面就是從我的機器上得到的輸出。你的輸出將不一樣,除非,由于某些令人吃驚的巧合,你與我有著共同的音樂品味。

                    album=
                    artist=Ghost in the Machine
                    title=A Time Long Forgotten (Concept
                    genre=31
                    name=/music/_singles/a_time_long_forgotten_con.mp3
                    year=1999
                    comment=http://mp3.com/ghostmachine
                    
                    album=Rave Mix
                    artist=***DJ MARY-JANE***
                    title=HELLRAISER****Trance from Hell
                    genre=31
                    name=/music/_singles/hellraiser.mp3
                    year=2000
                    comment=http://mp3.com/DJMARYJANE
                    
                    album=Rave Mix
                    artist=***DJ MARY-JANE***
                    title=KAIRO****THE BEST GOA
                    genre=31
                    name=/music/_singles/kairo.mp3
                    year=2000
                    comment=http://mp3.com/DJMARYJANE
                    
                    album=Journeys
                    artist=Masters of Balance
                    title=Long Way Home
                    genre=31
                    name=/music/_singles/long_way_home1.mp3
                    year=2000
                    comment=http://mp3.com/MastersofBalan
                    
                    album=
                    artist=The Cynic Project
                    title=Sidewinder
                    genre=18
                    name=/music/_singles/sidewinder.mp3
                    year=2000
                    comment=http://mp3.com/cynicproject
                    
                    album=Digitosis@128k
                    artist=VXpanded
                    title=Spinning
                    genre=255
                    name=/music/_singles/spinning.mp3
                    year=2000
                    comment=http://mp3.com/artists/95/vxp

                      <pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
                      <pre id="vvttv"></pre>

                        <p id="vvttv"></p>

                            <p id="vvttv"></p>

                                  <p id="vvttv"></p>

                                  <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                                    <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                                      <p id="vvttv"></p>

                                      这里只有精品视频