Mix-in:混入类是一种Python程序设计中的技术,作用是在运行期间动态改变类的基类或类的方法,从而使得类的表现可以发生变化。可以用在一个通用类接口中。

在实践一个 解析XML文件的实践中,体会动态改变的格式。

格式一般是:

定义一个基类:

class base:

def startElement(self,prefix,name,*args):

self.callback('Start',name,*args)

def callback(self,prefx,name,*args):

mname = prefix + name

method = getattr(self,mname,None)

if callbale(method): method(*args)

然后定义一个子类,在里面实现prefix+name的方法。

处理xml的内置库:

from   xml.sax.hander import ContentHandler

from xml.sax import parse

parse('xmlfile', instanceofContentHandler)

from os import path
from xml.sax.handler import ContentHandler
from xml.sax import parse

__metaclass__ = type

class Dispatcher:
def __init__(self):
pass
def startElement(self,name,attrs):
self.dispatch('start',name,attrs)
def endElement(self,name):
self.dispatch('end',name)

def dispatch(self,prefix,name,attrs=None):
propName = prefix + name.capitalize()
dname = 'default' + prefix.capitalize()
method = getattr(self,propName,None)
if callable(method):
if prefix == 'start':
method(attrs)
else:
method()
else:
method = getattr(self,dname,None)
if callable(method):
if prefix == 'start':
method(name,attrs)
else:
method(name)

class Sub_Dispatcher(Dispatcher,ContentHandler):
in_dir = False
in_page = False
outer = None
files = []
def characters(self,content):
print content
if self.in_page: self.outer.write(content)
def startPage(self,attrs):
self.in_page = True
fname = attrs['name'] + '.html'
self.outer = open(fname,'w')
if self.in_dir:
self.files.append(fname)
document ='''
<html>
<head>
<title>%s</title>
</head>
<body>
'''
self.outer.write(document % attrs['title'])

def endPage(self):
document = '</body></html>'
self.outer.write(document)
self.outer.close()
self.in_page = False
def startDirectory(self,attrs):
self.in_dir = True
self.fullpath = path.join(path.curdir,attrs['name'])
if not path.exists(self.fullpath):
from os import mkdir
mkdir(self.fullpath)
def endDirectory(self):
from distutils.file_util import move_file
for f in self.files:
move_file(f,path.join(self.fullpath,f))
def defaultStart(self,name,attrs):
self.outer.write('<' + name + ' ')
for key,value in attrs.items():
self.outer.write('%s="%s" '%(key,value))
self.outer.write('>')
def defaultEnd(self,name):
self.outer.write('</' + name + '>')
def startWebsite(self,attrs):
pass
def endWebsite(self):
pass
parse('website.xml',Sub_Dispatcher())

最新文章

  1. AngularJs之一
  2. android Handler.btionMessage()与Message.obtain()的区别
  3. 验证码的种类与实现 C#封装类 - .NET MVC WEBFORM
  4. c++ const总结
  5. etrace 跟踪程序函数动态执行流程
  6. c# 学习笔记(三)
  7. 【移动开发】Android中将我们平时积累的工具类打包
  8. 1.jdk、Tomcat、solr的安装和配置
  9. js之ECMAscript
  10. 提示让IE8以下版本的浏览器去更新浏览器
  11. C++格式化输出,C++输出格式控制
  12. 2018 Unite大会——《使用UPA工具优化项目》演讲实录
  13. cxf 整合 spring 时 java.lang.VerifyError异常
  14. centos7系统部署cobbler批量安装系统
  15. [物理学与PDEs]第5章习题5 超弹性材料中客观性假设的贮能函数表达
  16. hadoop day 7
  17. idea不显示gradle的视图解决办法
  18. JDBC事务(一)
  19. vim自动补全头注释与说明
  20. 2017-9-3模拟赛T1 卡片(card)

热门文章

  1. Ettercap 帮助文档
  2. Scratch 母鸡保护鸡蛋
  3. 怎样对小数进行向上取整 / 向下取整 / 四舍五入 / 保留n位小数 / 生成随机数
  4. Linux通用小技能
  5. WebSocket协议探究(二)
  6. ASP.NET Core本身已经集成了一个轻量级的IOC容器
  7. 学习C#自作计算器,菜鸟初学,有大神的指点,希望做的不够好的地方请大家多多指导。同时希望非常无聊的大神能加些其它计算进去
  8. node express4 + 前端自动刷新
  9. 使用element-ui中的el-upload组件时携带其他参数
  10. 与app交互因异步造成的坑记录