Python中用来替代if , elif ,else的装饰器 singledispatch

参考资料
    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()
发布了73 篇原创文章 · 获赞 14 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_42327755/article/details/94382650