Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 可以选择在类方法上使用装饰器_Python_Oop_Decorator_Python Decorators - Fatal编程技术网

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

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的一小部分,

我是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的一小部分,而不是整个大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)