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

浙公网安备 33010602011771号