引子:
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))
原文:https://www.cnblogs.com/yuan-x/p/13962526.html