免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1298 | 回复: 1
打印 上一主题 下一主题

菜鸟请教,关于父类调用子类方法的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-14 23:04 |只看该作者 |倒序浏览
  1. import os
  2. import sys
  3. from UserDict import UserDict

  4. def stripnulls(data):
  5.     "strip whitespace and nulls"
  6.     return data.replace("\00", "") .strip()
  7. class FileInfo(UserDict):
  8.     "store file metadata"
  9.     def __init__(self, filename=None):
  10.         UserDict.__init__(self)
  11.         self["name"] = filename
  12. class MP3FileInfo(FileInfo):
  13.     "store ID3v1.0 MP3 tags"
  14.     tagDataMap = {"title"   : (  3,  33, stripnulls),
  15.                   "artist"  : ( 33,  63, stripnulls),
  16.                   "album"   : ( 63,  93, stripnulls),
  17.                   "year"    : ( 93,  97, stripnulls),
  18.                   "comment" : ( 97, 126, stripnulls),
  19.                   "genre"   : (127, 128, ord)}
  20.     def __parse(self, filename):
  21.         "parse ID3v1.0 tags f rom MP3 file"
  22.         self.clear()
  23.         try:
  24.             fsock = open(filename, "rb", 0)
  25.             try:
  26.                 fsock.seek(-128, 2)
  27.                 tagdata = fsock.read(128)
  28.             finally:
  29.                 fsock.close()
  30.             if tagdata[:3] == "TAG":
  31.                 for tag, (start, end, parseFunc) in self.tagDataMap.items():
  32.                     self[tag] = parseFunc(tagdata[start:end])
  33.         except IOError:
  34.             pass
  35.     def __setitem__(self, key, item):
  36.         if key == "name" and item:
  37.             self.__parse(item)
  38.         FileInfo.__setitem__(self, key, item)
  39. def listDirectory(directory, fileExtList):
  40.     "get list of file info objects for files of part icular extensions"
  41.     fileList = [os.path.normcase(f)
  42.                 for f in os.listdir(directory)]
  43.     fileList = [os.path.join(directory, f)
  44.                for f in fileList
  45.                 if os.path.splitext(f)[1] in fileExtList]
  46.     def getFileInfoClass(filename, module=sys.modules[FileInfo.__module__]):
  47.         "get file info class from filename extension"
  48.         print sys.modules[FileInfo.__module__]
  49.         print FileInfo.__module__
  50.         subclass = "%sFileInfo" % os.path.splitext(filename)[1].upper()[1:]
  51.         print subclass
  52.         return hasattr(module, subclass) and getattr(module, subclass) or FileInfo
  53.     return [getFileInfoClass(f)(f) for f in fileList]
  54. if __name__ == "__main__":
  55.     for info in listDirectory(r'C:\Users\god\Desktop\tmp', [".mp3"]):
  56.         print "\n".join(["%s=%s" % (k, v) for k, v in info.items()])
  57.         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):的实例。

大家是如何理解的呢?

论坛徽章:
0
2 [报告]
发表于 2012-06-15 10:41 |只看该作者
已解决,通过return hasattr(module, subclass) and getattr(module, subclass) or FileInfo

实现的。

当时没有注意 谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP