参考资料
1-<流畅的python> 第7章 7.8.2 单分派泛函数(170页)
2-https://www.icode9.com/content-1-231851.html
# 1-根据参数的类型
def demo_test(para):
ret = html.escape(repr(para))
return "<pre>{}</pre>".format(ret)
ret = demo_test("你好")
print(ret)
"""
以上是一个生成简单标签的泛函数, 如果需求是:
字符串生成p标签
元组生成list标签
数字生成...
方法一:
在上边的泛函数中做判断:
if type(para) == int:
....
elif type(para) == str:
....
elif
方法二:
"""
from functools import singledispatch
from collections import abc
import html
import numbers
# 泛函数
@singledispatch
def htmlize(obj):
content = html.escape(repr(obj))
return "<pre>{}</pre>".format(content)
# 用来处理字符串的函数
@htmlize.register(str)
def _(text):
content = html.escape(text).replace('\n', '<br>\n')
return '<p>{0}</p>'.format(content)
# 用来处理数字的函数
@htmlize.register(numbers.Integral)
def _(n):
return '<pre>{0} (0x{0:x})</pre>'.format(n)
# 用来处理元组的函数
@htmlize.register(tuple)
@htmlize.register(abc.MutableSequence)
def _(seq):
inner = '<li>\n<li>'.join(htmlize(item) for item in seq)
return '<ul>\n<li>' + inner + '</li>\n</ul>'
# ret = htmlize(("姓名", "年龄", "身高"))
ret = htmlize(123)
print(ret)
# 2-根据参数的值
# python内置的装饰器只能根据参数的类型进行判断,执行不同的方法
# 如何根据参数的值来实现类似的效果:?
class StateMachine(object):
def dispatch(self, *args, **kwgs):
getattr(self, 'do_{}'.format(self.state))(*args, **kwgs)
def do_new(self):
print('new')
def do_archive(self):
print('archive')
sm = StateMachine()
sm.state = 'new'
sm.dispatch()
sm.state = 'archive'
sm.dispatch()
Python中用来替代if , elif ,else的装饰器 singledispatch
猜你喜欢
转载自blog.csdn.net/qq_42327755/article/details/94382650
今日推荐
周排行