设为首页 收藏本站
查看: 1009|回复: 0

[经验分享] 深入Python(四)

[复制链接]

尚未签到

发表于 2015-4-24 07:32:32 | 显示全部楼层 |阅读模式
  先来看一段Python代码:



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"]):
print "\n".join(["%s=%s" % (k, v) for k, v in info.items()])
print

  
  这个程序的输入要取决于你硬盘上的文件。为了得到有意义的输出,你应该修改目录路径指向你自已机器上的一个 MP3 文件目录。
  你不需要完全明白上述代码的意义,因为本代码只是为了说明Python中的对象和面向对象的内容。
  首先你会看到这样的代码 from UserDict import UserDict      (from module import *)
  这意味着你可以在自己的模块中直接使用UserDict模块的UserDict类(当然如果是使用的后面括号里的那条语句的话也可以直接使用其他对象,如函数)。但不提倡这样用,因为假如你自己的模块中也有一个UserDict类,就不好分辨了,判定一个特殊的函数或属性是从哪来的有些困难,并且会造成调试和重构都更困难。
  关于Python中类的定义可以看这里的类及继承
  关于Python中类的方法可以看这里的方法  会发现类的方法与函数的区别就是,定义类方法时第一个参数必须是self,而调用类方法是则不需要这个self参数(除了调用父类的方法时,调用父类的方法也需要传递self参数)。
  而Python的类里也有类似静态变量,实例变量的概念。静态变量就是像上述代码MP3FileInfo类中tagDataMap那样在那个位置定义。而实例变量一般是在__init__()方法里通过self.变量名来定义。 由于Python是动态类型语言,所以这些变量都不用声明,在第一次赋值时会自动确定其类型,并且由于Python是强类型语言,所以一旦这些变量的类型确定了,如果不做明确的类型转换,不能一种类型当另一种类型使用。
  在Python中也有私有的概念,如果一个函数名是以__(双下划线)开始,那么它是私有的,只能在该模块内使用。类似的如果一个类的方法名或类的变量名是__开始,那么它们是私有的,只能在该类内被使用。如上述代码中MP3FileInfo类的__parse方法。
  而想__init__方法这样两边都有双下划线的方法称为专有方法,你可以手动调用,但它们主要是你使用特殊语法时Python替你调用的,如当你创建一个类的实例时,Python会帮你调用__init__方法。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-60088-1-1.html 上篇帖子: libsvm与python的使用 下篇帖子: Codeblocks调试STL——gdb with python support
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表