Python生成自定义类并添加自定义方法
来源:互联网 发布:千牛和淘宝卖家 编辑:程序博客网 时间:2024/06/05 16:00
最近准备做个简单的web服务器,通过配置url method header 等属性实现自定义的API,框架考虑的是Tornado和PyRestful。然后就遇到了问题,API的数量是动态生成的,每个API的请求方式也不一样。如果单纯的PyRestful是满足不了的。
import pyrestful.restimport tornado.ioloopfrom pyrestful import mediatypesfrom pyrestful.rest import get, postclass Book(object): isbn = int title = strclass BookResource(pyrestful.rest.RestHandler): @get(_path="/books/json/{isbn}", _types=[int], _produces=mediatypes.APPLICATION_JSON) def getBookJSON(self, isbn): book = Book() book.isbn = isbn book.title = "My book for isbn " + str(isbn) return book
因此需要动态生成class及claas的method,还好Python是有对应的语法的:Metaclass
通过继承type,重写__new__(cls, name, bases, attrs)方法
class RestHandleMetaclass(type): def __new__(cls, name, bases, attrs): # do something ,such as redefinition attrs # ps: attr is a tuple return type.__new__(cls, name, (RestHandler,), attrs)
接着遇到了第二个问题,@get(_path="/books/json/{isbn}", _types=[int], _produces=mediatypes.APPLICATION_JSON) 如何添加到方法上面。一开始我以为@符号是注解,走了不少弯路,后来才知道@在Python中是用来处理Decorator(装饰器)的。(参考资料:AB)。 由于attrs中的元素是方法,如何生成方法,同时已经被装饰器处理过,同时能修改@get()中的参数,并最终返回一个方法 成了第三个问题。还好pyrestful.rest.get启发了我
def get(*params, **kwparams):""" Decorator for config a python function like a Rest GET verb"""def method(f):return config(f,'GET',**kwparams)return method
Python中的Method内部是可以定义Method,并返回Method的。同时尝试后发现内部定义的Method是可以加上@get,最终返回装饰器进行处理后的Method
class RestHandleMetaclass(type): @staticmethod def dynamicDecorator(data): _path = "/books/json/" + str(data) + "/{isbn}" _types = [int] _produces = mediatypes.APPLICATION_JSON @get(_path=_path, _types=_types, _produces=_produces) def getBookJSON(self, isbn): book = Book() book.isbn = isbn book.title = "My book for isbn " + str(isbn) return book return getBookJSON def __new__(cls, name, bases, attrs): for x in range(5): attrs["getBookIsbn_" + str(x)] = RestHandleMetaclass.dynamicDecorator(x) return type.__new__(cls, name, (RestHandler,), attrs)
最后补上相关的代码。
class TestA(object, metaclass=RestHandleMetaclass): pass
if __name__ == '__main__': try: print("Start the service") app = pyrestful.rest.RestService([TestA]) app.listen(8080) tornado.ioloop.IOLoop.instance().start() except KeyboardInterrupt: print("\nStop the service")
阅读全文
0 0
- Python生成自定义类并添加自定义方法
- 添加自定义的Python模块方法
- Ext自定义类并添加事件处理
- Python添加自定义模块
- android自定义控件并添加属性的方法以及示例
- android自定义控件并添加属性的方法以及示例
- android自定义控件并添加属性的方法以及示例
- jquery添加自定义方法
- 自定义UICollectionViewLayout并添加UIDynamic
- 自定义UICollectionViewLayout并添加UIDynamic
- python自定义函数和类并调用
- python requests库添加自定义cookie的方法
- python requests库添加自定义cookie的方法
- python使用*.pth添加环境变量使用自定义模块的方法
- DataSet自定义添加table并添加数据
- 使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
- Unity添加自定义拓展方法
- jquery validator添加自定义方法
- 微信网页开发之获取用户unionID的两种方法--基于微信的多点登录用户识别
- 如果java的成员变量和局部变量重名 JAVA会用局部变量覆盖掉成员
- 使用freemarker生成word
- JDK与JRE的区别?
- 指针和引用的区别
- Python生成自定义类并添加自定义方法
- sprintf_s函数用法
- Badboy自动化测试工具3 创建suites,tests,steps和Template
- 2017济南北大青鸟accp和学士后课程的真实情况
- javaWeb中文件的上传与下载及乱码问题解决
- Android ScrollView的使用
- 处理Minimum supported Gradle version is 3.3. Current version is 2.14.1问题
- Eclipse高效率开发技巧
- 链表