python weibo sdk

class _Callable(object):

    def __init__(self, client, name):
        self._client = client
        self._name = name

    def __getattr__(self, attr):
        if attr=='get':
            return _Executable(self._client, 'GET', self._name)
        if attr=='post':             
            return _Executable(self._client, 'POST', self._name)
        name = '%s/%s' % (self._name, attr)
        print name
        return _Callable(self._client, name)

    def __str__(self):
        return '_Callable (%s)' % self._name

这是一个递归函数
当调用比如user.show.get 构成了多层的属性访问
重写__getattr__逐级转化成user/show  直到遇见get或post,来执行请求

class _Executable(object):

    def __init__(self, client, method, path):
        self._client = client
        self._method = method
        self._path = path

    def __call__(self, **kw):
        method = _METHOD_MAP[self._method]
        if method==_HTTP_POST and 'pic' in kw:
            method = _HTTP_UPLOAD
        return _http_call('%s%s.json' % (self._client.api_url, self._path), method, self._client.access_token, **kw)

    def __str__(self):
        return '_Executable (%s %s)' % (self._method, self._path)

利用__call__来接受传入参数 进一步判定请求类型  如果带有图片则成为upload

_http_call方法进行url生成
user.show.get(uid=12345)
最终生成的url为https://api.weibo.com/2/users/show.json?uid=12345
请求后的返回进行json解析

猜你喜欢

转载自linest.iteye.com/blog/1837924