博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 实践--混入类
阅读量:7091 次
发布时间:2019-06-28

本文共 2364 字,大约阅读时间需要 7 分钟。

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())

 

转载于:https://www.cnblogs.com/ahMay/p/5707844.html

你可能感兴趣的文章
l2tp拨号失败,案例解析
查看>>
java根据jar包反编译后修改再打包回jar的做法
查看>>
Gartner:DAM(数据库审计)正在向DAP(数据库审计与保护)演进
查看>>
数据库中的读一致性和脚本匹配
查看>>
ABAP ALV显示例子
查看>>
d3.js
查看>>
jflex1.5扫描中文字符
查看>>
mysql视图和临时表的区别
查看>>
在Linux操作系统下修改IP、DNS和路由配置
查看>>
我的友情链接
查看>>
设计工具产品是怎么收费的?
查看>>
我的友情链接
查看>>
如何在PDF阅读器中新建文档
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
Linkwedo 提升信息在决策中的力量
查看>>
雨林木风GhostXP_SP3装机版YN11.6_2011.06更新
查看>>
我的友情链接
查看>>
vim8.0 不能用鼠标
查看>>
OpenGL进阶(十) - obj文件的导入
查看>>