对象和面向对象

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Nov  8 21:35:57 2018

@author: xyy
"""

import os
import sys
from collections import UserDict
def stripnulls(data):
    ''' strip whutespace and nulls'''
    return data.replace('\00','').strip()
class FileInfo(UserDict):
    '''store fle metadata'''
    def __init__(self,filename = None):
        UserDict.__init__(self)
        self['name']=filename
class MP3Fileinfo(FileInfo):
    '''stroe ID3v1.0 MP3 tage'''
    tagDataMap ={'title':(3,33,stripnulls),
                 'artist':(33,63,stripnulls),
                 'album':(63,93,stripnulls),
                 'year':(93,126,stripnulls),
                 'comment':(97,126,stripnulls),
                 'genre':(127,128,ord)
                 }
    def __parse(self,filename):
        '''parse ID3v1.0 tags form 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 form filename extension'''
        subclass = '%s FileInfo'%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('/home/xyy/python_learning',['.mp3']):
        print('\n'.join(['%s=%s'%(k,v) for k,v in info.items()]))
        print()

以上程序涉及的知识点:

  1. import和import from
  2. 类的定义
    class name:
    继承 class name(classname):
    构造函数 init(self)
class FileInfo(UserDict):
    '''store fle metadata'''
    def __init__(self,filename = None):
        UserDict.__init__(self)
        self['name']=filename
  1. 类的实例化 f=FileInfo(’/xyy/xyy.mp3’) 创建类的实例只要调用一个类,仿佛 是一个函数
  2. 垃圾回收
    python 不需要明确地释放实例,因为指派给他们的变量超出作用域时,会自动释放。内存漏泄在python很少出现
  3. UserDict
    用户自定义字典类UserDict,它是封装了一个字典类dict。主要使用来拷贝一个字典的数据,而不是共享同一份数据。
    class collections.UserDict([initialdata])
    本类主要模拟一个字典。在类成员data里拷贝了一份字典数据,如果没有提供初始数据,就保存为空的方式。
    UserDict类实例提供下面的属性:
    data
    用来保存字典的成员变量。
    例子:
    #python 3.4
    import collections
    d = {‘a’: 2, ‘b’: 3}
    ud = collections.UserDict(d)
    print(d, ud)
    del d[‘a’]
    print(d, ud)
    结果输出如下:
    {‘a’: 2, ‘b’: 3} {‘a’: 2, ‘b’: 3}
    {‘b’: 3} {‘a’: 2, ‘b’: 3}
  def __setitem__(self,key,item):
        if key =='name' and item:
            self.__parse(item)
        FileInfo.__setitem__(self,key,item)
  1. setitem_专用方法
    这个是一个类方法,可以在子类中重新定义他,对父类的方法进行覆盖。

  2. ==和is
    == 比较两个字符串的值是否相等
    is 两个字符串变量是否指向同一块物理地址

  3. 类属性共享

  4. 类的私有
    如果一个python函数,类方法,或属性的名字以两个下划线开始,那么他是私有的。

  5. 数据属性和类属性
    类属性属于类本身,可以通过类名进行访问/修改
    类属性也可以被类的所有实例访问/修改
    在类定义之后,可以通过类名动态添加类属性,新增的类属性也被类和所有实例共有
    数据属性只能通过实例访问
    在实例生成后,还可以动态添加实例数据属性,但是这些实例数据属性只属于该实例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值