初学 Python,最近在看这个项目 zhihu-py3。
ZhihuClient
类,主要实现登录相关的操作,同时创建一个网络会话( requests.session );Author(url, session)
类,传入某作者的知乎域名,传入一个 session,返回 Author 对象,比如 Author.name
可以获取用户名实现这样子调用:
client = ZhihuClient()
client.author # 这是一个 Author 对象
我只能想到的是,在 ZhihuClient 里定义一个 author 方法,用来创建并返回 Author 对象
def author(url, session=self.session):
author = Author(url, session)
return author
试了一下是能实现的。但是除了 Author 之外还有好多的类,如果一个一个定义过去那得多麻烦。所以看作者的实现方法
在 ZhihuClient
里定义 __getattr__()
,实现动态调用。下面是作者的源码
def __getattr__(self, item: str):
"""本函数用于获取各种类,如 `Answer` `Question` 等.
:支持的形式有:
1. client.answer()
2. client.author()
3. client.collection()
4. client.column()
5. client.post()
6. client.question()
7. client.topic()
参数均为对应页面的 url,返回对应的类的实例。
"""
def getter(url):
return getattr(module, item.capitalize())(url, session=self._session)
attr_list = ['answer', 'author', 'collection',
'column', 'post', 'question', 'topic']
if item.lower() in attr_list:
module = importlib.import_module('.'+item.lower(), 'zhihu')
return getter
getter(url)
方法是用来传递参数的。我尝试将它去掉,直接 return getattr(module, item.capitalize())(url, session=self._session)
,但是这样子就会报错:参数 url
未定义。我总感觉定义一个 getter
有点多余(没有任何讽刺作者的意思),有没有更好的解决办法?(如何在 __getattr__()
里传递参数)这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.