Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
类型错误:';str';对象不可调用-Python装饰器概念_Python_String_Oop_Decorator - Fatal编程技术网

类型错误:';str';对象不可调用-Python装饰器概念

类型错误:';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

我试图在上面的python编程中实现decorator概念。但是,当我运行代码时,我面临着:TypeError:“str”对象不可调用


我不知道我为什么要面对这个错误。有人能帮我吗?

这不是函数装饰器的制作方法。装饰程序需要返回一个新函数!您所做的是立即调用该方法。试试这个:

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