需求
使用python面向对象技术,类的成员方法不确定(包括个数和方法名),在类实例化之后才能确定
思考
- python中动态生成方法,使用exec()
- 类的成员方法在实例化之后才能确定确定,考虑在初始化时增加逻辑处理,给实例动态增加方法,使用MethodType()
实施
开发环境:python3,python2也支持此用法,语法微调即可
类结构,只保留关键代码
from types import MethodType
import requests
from ziyuan_sdk.common import get_method # 公共方法,可自行定义
class ZiYuan:
def __init__(self, pid, domain):
"""
:param pid: 项目ID
:param domain: 域名,方法名称及其他参数按需获取
"""
self.pid = pid
self.domain = domain
self.get_func()
def get_func(self):
"""按需生成方法"""
r = requests.post(self.domain, data=dict(pid=self.pid)).json()
"""
r数据结构:
{
"response":"ok",
"data":[
{
"name":"get_knowledge", # 方法名
"url":"" # 方法用到的重要参数
}
]
}
"""
if r['response'] == 'ok':
for obj in r['data']:
# 以下为核心代码
exec(self.get_method_str(obj['name'], obj['url'])) # 动态生成方法
self.__dict__[obj['name']] = MethodType(eval(obj['name']), self) # 将方法赋值给对象
def get_method_str(self, name, url):
"""获取方法对应字符串"""
func_str = """def {name}(self, **kwargs):
ks = dict(
kwargs=kwargs,
name='{name}',
url='{url}'
)
return get_method(**ks)
""".format(name=name,
url=url)
return func_str
使用
zy = ZiYuan(pid=1, domain="https://test/")
zy.get_knowledge(id=1234)