- 论坛徽章:
- 0
|
- 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 f rom 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 part icular 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"
- print sys.modules[FileInfo.__module__]
- print FileInfo.__module__
- subclass = "%sFileInfo" % os.path.splitext(filename)[1].upper()[1:]
- print subclass
- 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(r'C:\Users\god\Desktop\tmp', [".mp3"]):
- print "\n".join(["%s=%s" % (k, v) for k, v in info.items()])
- print
复制代码 问题是:
def __setitem__(self, key, item):
if key == "name" and item:
self.__parse(item)
FileInfo.__setitem__(self, key, item)
这个函数是在哪里被谁调用的?经过调试之后发现是在它的父类( self["name"] = filename)这个地方调用的。
也上网查过类似的问题:父类调用子类方法。但是。。。小弟不知道该如何理解这个问题。。。
整个代码并没有出现class MP3FileInfo(FileInfo):的实例。
大家是如何理解的呢? |
|