场景
实现一个python调用java接口的功能,java接口是以http方式提供的。为了实现比较舒服的调用的方式,我不准备以send({"method": "echo"})这种方式调用,而是api.echo()
但是python里面并没有提供类似php的__call和__callStatic的函数
根据python的__getattr__来实现一个,但是这个解决方案不完美,有局限性。
实现
代码如下 | 复制代码 |
# encoding: utf-8 import json class OPS(object): def __init__(self, s): def sendRequest(self, msg): def __getattr__(self, name): if __name__ == '__main__': |
补充一些
关于CSharp中的访问器:Python指出这是一种拦截模式,感觉这样才准确。。。
迭代器:
__iter__方法返回一个迭代器,所谓迭代器就是具有next方法(这个方法没有任何参数)
生成器:
代码如下 | 复制代码 |
def flatten(nested): for sublist in nested: for element in sublist: yield element >>> nested=[[1,2],[3,4],[5]] >>> for num in flatten(nested): print num or |
递归生成器:
代码如下 | 复制代码 |
def flatten(nested): try: for sublist in nested: for element in flatten(sublist): yield element except TypeError: yield nested 针对字符串情况改进版: def flatten(nested): try: #不要迭代类似字符串的对象 try:nested+'' except TypeError:pass else:raise TypeError for sublist in nested: for element in flatten(sublist): yield element except TypeError: yield nested >>> list(flatten([[[1],2],3,4,[5,[6,7]],8])) [1, 2, 3, 4, 5, 6, 7, 8] >>> list(flatten(['foo',['bar',['baz']]])) ['foo', 'bar', 'baz'] |
通过这个小例子可以体会到递归生成器的强大威力:几行代码就可以搞定树的遍历。
生成器方法:
代码如下 | 复制代码 |
def repeater(value): while True: new=(yield value) if new is not None:value=new >>> r=repeater(42) >>> r.next() 42 >>> r.sent("Hello World!") "Hello World!" |
其余的还有throw,close方法。