可选择在类方法上使用装饰器

时间:2014-03-29 13:06:00

标签: 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

现在用户拥有所有数据,并且可以执行他/她想要的任何操作。我想添加一些“便利性”#39;方法,例如;让用户获得json的一小部分而不是整个大json响应。

我的想法是为此使用pythons装饰器。我的目标可能是这样的:

# 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

当然,这不是装饰器的工作原理,但是有没有办法在现有的类方法上选择使用装饰器,或装饰器是否总是必须包装原始方法?

那么这里最恐怖的方式是什么?我真的很想使用装饰器,但如果这是一个不好的主意,我很好,只需创造更多的便利'我的Api类中的方法。

1 个答案:

答案 0 :(得分:3)

您可以选择向API中添加更多方法,或者为用户提供实用程序功能:

from yourmodule import MyAPI

api = MyAPI

filtered_timetable = api.filter_on(something)

from yourmodule import MyAPI, filter_timetable

api = MyAPI

filtered_timetable = filter_timetable(api.time_table, something)

请记住,装饰者只是驯服者;语法:

@foo
def bar():
    pass

只是语法糖:

def bar():
    pass
bar = foo(bar)
调用

foo(),返回值替换装饰对象。通常你使用装饰函数,但没有什么说你必须使用这些函数作为装饰器。

filter_timetable可能是这样的装饰者;如果你有一个用例将它用作两者。