Python接收任意长度参数和__call__方法

引子:

  Python中的函数接收参数可以通过*和**来接收任意多的位置参数和关键字参数

def creat_html(tag,*content,cls=None,**attrs):
    '''
    生成一个或者多个html标签
    '''
    print(tag,content,cls,attrs)
    if cls is not None:
        attrs["class"]=cls
    if attrs:
        attr_str=''.join("%s = %s"%(attr,value)
                         for attr,value in sorted(attrs.items()))
    else:
        attr_str=' '
    if content:
        return '\n'.join('<%s %s>%s</%s>'%
                         (tag,attr_str,c,tag) for c in content)
    else:
        print('____',tag,attr_str)
        return '<%s%s />'%(tag,attr_str)
# print(tag('br'))
# print(tag('p','hello'))
# print(tag('p','hello',id=33))
print(creat_html('p','hello','world',cls='sidebar'))

'''

co_varnames  返回函数的参数 以及函数内的变量 
co_argcount  返回函数的参数(不包含* 和 ** )也就是*args之前的参数个数 
co_kwonlyargcount  *args 和 **kwargs中间的
'''
print(creat_html.__code__.co_varnames)
print(creat_html.__code__.co_argcount)
print(creat_html.__code__.co_kwonlyargcount)
print(creat_html.__defaults__)
print(creat_html.__kwdefaults__)

  python中的__call__方法,实现了()运算符,即可调用对象协议

class Bing:
    def __init__(self,items):
        self._items=list(items)
        random.shuffle(self._items)
    def pick(self):
        try:
            return self._items.pop()
        except IndexError:
            raise LookupError('列表已经空了')
    def __call__(self):
        print('in call')
        return self.pick()

a=Bing(range(10))
# print(a.pick())
print(a())  # 可以明显的看到  调了__call__
# print(callable(a))

  

posted @ 2020-11-12 10:22  Yuan_x  阅读(506)  评论(0编辑  收藏  举报