类型错误:';str';对象不可调用-Python装饰器概念
我试图在上面的python编程中实现decorator概念。但是,当我运行代码时,我面临着:TypeError:“str”对象不可调用类型错误:';str';对象不可调用-Python装饰器概念,python,string,oop,decorator,Python,String,Oop,Decorator,我试图在上面的python编程中实现decorator概念。但是,当我运行代码时,我面临着:TypeError:“str”对象不可调用 我不知道我为什么要面对这个错误。有人能帮我吗?这不是函数装饰器的制作方法。装饰程序需要返回一个新函数!您所做的是立即调用该方法。试试这个: def upper_case_decorator(in_arg): upper_word = in_arg() # please keep () after in_arg because we are passing
我不知道我为什么要面对这个错误。有人能帮我吗?这不是函数装饰器的制作方法。装饰程序需要返回一个新函数!您所做的是立即调用该方法。试试这个:
def upper_case_decorator(in_arg):
upper_word = in_arg() # please keep () after in_arg because we are passing function name as input
result = upper_word.upper()
return result
@upper_case_decorator
def random_var():
return "asdfg"
var = random_var()
print(var)
再进一步,为了使函数装饰器更灵活,您需要将参数从包装器函数转发到原始函数。这通常通过传递*args
和**kwargs
def upper_case_decorator(in_arg):
def wrapper():
upper_word = in_arg()
result = upper_word.upper()
return result
return wrapper
@upper_case_decorator
def random_var():
return "asdfg"
var = random_var()
print(var)
再进一步,您可以让函数装饰器本身接受参数。在这个场景中,您有一个返回decorator的函数,该decorator返回一个包装函数。例如,在本例中,您可以传入一个单独的方法,该方法描述您希望如何转换响应
def upper_case_decorator(in_arg):
def wrapper(*args, **kwargs):
upper_word = in_arg(*args, **kwargs)
result = upper_word.upper()
return result
return wrapper
def format_response(response_func):
def format_response_decorator(original_func):
def format_response_wrapper(*args, **kwargs):
return response_func(original_func(*args, **kwargs))
return format_response_wrapper
return format_response_decorator
@format_response(lambda s: s + "def")
@format_response(lambda s: "abc" + s)
@format_response(lambda s: s.upper())
def random_var():
return "test"
print(random_var())
abcTESTdef