Python 可以选择在类方法上使用装饰器
我是Python新手,正在为api构建包装器。我想让用户决定他/她是否想在我从模块中公开的方法上使用装饰器 例如:Python 可以选择在类方法上使用装饰器,python,oop,decorator,python-decorators,Python,Oop,Decorator,Python Decorators,我是Python新手,正在为api构建包装器。我想让用户决定他/她是否想在我从模块中公开的方法上使用装饰器 例如: # create a new instance api = MyApi() # return a simple json response with all the data related to a timetable print api.time_table 现在用户拥有了所有数据,可以做任何他/她想做的事情。我想添加一些“方便”的方法,例如;让用户获得json的一小部分,
# create a new instance
api = MyApi()
# return a simple json response with all the data related to a timetable
print api.time_table
现在用户拥有了所有数据,可以做任何他/她想做的事情。我想添加一些“方便”的方法,例如;让用户获得json的一小部分,而不是整个大json响应
我的想法是使用蟒蛇装饰器。或者,我的目标如下:
# use the method and get al the data
print api.time_table
# Optionally, get a specific part, just the shows part. (PSEUDO CODE BELOW)
@shows
print api.time_table
当然,这不是decorator的工作方式,但是有没有一种方法可以选择性地在现有类方法上使用decorator,或者decorator总是必须包装原始方法
那么,这里最适合蟒蛇的方式是什么?我真的很想使用decorator,但如果这是一个坏主意,我可以在我的
Api
类中创建更多的“便利”方法。您的选择是向Api添加更多方法,或者为用户提供实用函数:
from yourmodule import MyAPI
api = MyAPI
filtered_timetable = api.filter_on(something)
或
记住,装饰者只是可调用的;语法:
@foo
def bar():
pass
只是语法糖:
def bar():
pass
bar = foo(bar)
调用foo()
,返回值替换修饰对象。通常,您将函数用于装饰器,但没有任何规定您必须仅将这些函数用作装饰器
filter\u时间表
可能就是这样一个装饰师;如果您有同时使用它的用例。您只能在函数和类上使用装饰器,而不能在其他任何东西上使用装饰器(例如print
语句)。你应该扩展你的API来给用户更多的选择。谢谢你的快速回答,所以没有办法在现有函数上使用装饰器?在这种情况下,我必须使用更多的类方法。也许我会想出一些使用lambdas方便的方法。当然你也可以使用装饰器;装饰器只是函数@foo
应用于bar
与bar=foo(bar)
完全相同;使用bar
作为参数调用时,将bar
替换为返回值foo
。
def bar():
pass
bar = foo(bar)