python 魔术函数调用的例子

场景

实现一个python调用java接口的功能,java接口是以http方式提供的。为了实现比较舒服的调用的方式,我不准备以send({"method": "echo"})这种方式调用,而是api.echo()

但是python里面并没有提供类似php的__call和__callStatic的函数

根据python的__getattr__来实现一个,但是这个解决方案不完美,有局限性。

实现

 代码如下 复制代码

# encoding: utf-8

import json
import urllib, urllib2

class OPS(object):
    s = None

    def __init__(self, s):
        self.s = s

    def sendRequest(self, msg):
        postData = json.dumps(msg)
        print(postData)
        req = urllib2.Request(self.s, postData)
        try:
            resp = urllib2.urlopen(req)
        except Exception as e:
            return False
        cnt = resp.read()
        try:
            cnt = json.loads(cnt)
        except Exception as e:
            pass
        return cnt

    def __getattr__(self, name):
        def func(*args, **kwargs):
            # args 不处理 (由于是序列化成json传输的,python的dict是无序的,抛弃对list的处理)
            data = {
                'method': name,
                'parameter': kwargs
            }
            return self.sendRequest(data)
        return func

if __name__ == '__main__':
    ops = OPS('你的http接口调用地址')
    print(ops.hello(word="你好"))

补充一些

关于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
>>> list(flatten(nest))
[1, 2, 3, 4, 5]
 
循环生成器:
>>> g=((1+2)**2 for i in range(2,27))
>>> g.next()
9
也可以放在括号内直接使用:
>>> sum(i**2 for i in range(10))
285

 
递归生成器:

 代码如下 复制代码
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方法。

时间: 2024-10-12 01:31:16

python 魔术函数调用的例子的相关文章

Python魔术方法详解_python

介绍 此教程为我的数篇文章中的一个重点.主题是魔术方法. 什么是魔术方法?他们是面向对象的Python的一切.他们是可以给你的类增加"magic"的特殊方法.他们总是被双下划线所包围(e.g. __init__ 或者 __lt__).然而他们的文档却远没有提供应该有的内容.Python中所有的魔术方法均在Python官方文档中有相应描述,但是对于他们的描述比较混乱而且组织比较松散.很难找到有一个例子(也许他们原本打算的很好,在开始语言参考中有描述很详细,然而随之而来的确是枯燥的语法描述

Python Socket通讯程序例子

python中内置的socket模块使得网络编程更加简单化,下面就通过两个小小脚本来了解客户端如何与服务器端建立socket. 客户端代码: #clietn.py if __name__ == '__main__':  #判断是否调用自己本身,如果不是则__name__为脚本名称 import socket  #导入我们所需的socket模块sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  #第一步是创建socket对象.调用so

Python自动单元测试的例子

Python unittest模块的相关用法 待测源码类:widget.py #!/usr/bin/env python class Widget: def __init__(self, size = (40, 40)): self._size = size def getSize(self): return self._size def resize(self, width, height): if width == 0 or height < 0: raise ValueError, "

python文件遍历的例子

在linux系统下遍历文件不算是新鲜功能,如果给出一个目录,要根据这个目录的结构去做某些操作,这个就要到遍历了,谈到遍历就不能不说递归,因为遍历是递归的典型应用场景,那什么是递归?其实递归就是定义的函数又调用了自己,比如列出指定目录下的所有文件,如果这个目录下除了文件还有目录,就就需要再进入这个子目录里,依次类推直到没有目录了结束,递归比较抽象,我们直接上例子说明: #!/usr/mport os   import os   def Rec(path):   all_files = os.lis

python配置文件操作的例子

写在前面,公众号的留言功能开通有一段时间了,如果需要交流请尽量选择留言的方式,因为平时我也要working,所以后台消息有时会无法及时回复,望理解,正文如下. 在我们写一个功能性的python脚本时,有时需要读取一个配置文件,这个配置文件可以给用户自定义修改,以实现脚本的最大灵活性,谈到配置文件的修改,这对我们运维人员来说应该都不陌生,因为运维的工作估计很大部分是内容就是通过修改配置文件来完成的,如果产品的任意改动变化都要修改改代码,可想而知那样效率会多么低下,例如游戏中开个1.5倍经验,不好意

python读写excel的例子(生成excel)

例子.超级简单读取csv 1.用python读取csv文件: csv是逗号分隔符格式 一般我们用的execl生成的格式是xls和xlsx  直接重命名为csv的话会报错: Error: line contains NULL byte insun解决方案:出错原因是直接是把后缀为xls的execl文件重命名为csv的 正常的要是另存为csv文件 就不会报错了 譬如我们有这么个csv文件: #!/usr/bin/env python # -*- coding:utf-8 -*-   import c

python中cPickle用法例子分享_python

在python中,一般可以使用pickle类来进行python对象的序列化,而cPickle提供了一个更快速简单的接口,如python文档所说的:"cPickle -- A faster pickle". cPickle可以对任意一种类型的python对象进行序列化操作,比如list,dict,甚至是一个类的对象等.而所谓的序列化,我的粗浅的理解就是为了能够完整的保存并能够完全可逆的恢复.在cPickle中,主要有四个函数可以做这一工作,下面使用例子来介绍. 1, dump: 将pyt

python扫描端口程序例子

1.python单线程扫描端口,代码如下:  代码如下 复制代码 #!/usr/bin/env python #coding:utf8 import socket   ip = 'www.111cn.net for port in range(1,1024,1):     sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)     sk.settimeout(2)     print "正在扫描端口: %d" % port   

Python设计模式Adapter Pattern例子详解

Python设计模式 3种类型:  1. 创建型     *灵活方式创建对象*          - 抽象工厂          - 建造者          - 工厂方法          - 原型          - 单例  2. 结构型      *将一种对象改装为另一种对象,或将小对象合成大对象*          - 适配器          - 桥接          - 组合          - 修饰器          - 外观          - 享元