首页 > 解决方案 > 类方法中带有验证装饰器的 TypeError

问题描述

我正在尝试在一个类中使用一个简单的验证装饰器:

import numpy as np

def validate_decorator(func):
    def func_wrapper(value):
        if value < 0:
            raise Exception("Not valid!")
        return func(value)
    return func_wrapper


class MyClass:
    def __init__(self):
        self.my_array = np.zeros(shape=(10,))
        self.idx = 0

    @validate_decorator
    def insert_value(self, value):
        self.my_array[self.idx] = value
        self.idx += 1

    def __str__(self):
        return f"{self.my_array[:self.idx]}"


a = MyClass()
a.insert_value(3.14)

这给

TypeError: func_wrapper() 接受 1 个位置参数,但给出了 2 个

我不明白这个错误。

如果我将 修改func_wrapper为也接受一个self参数 and return self(而不是func(value)),那么没有TypeError,但正如预期的那样,insert_value不会执行。

有人可以帮助我了解如何在我的课堂上使用这个简单的装饰器吗?

标签: pythonpython-3.xvalidationpython-decorators

解决方案


我添加了self参数func_wrapper并将func_wrapper' 的返回值更改为func(self, value). 它现在有效,insert_value已执行。

self除非转换为类方法或静态方法,否则类实例方法始终具有此必需属性: Python 中“self”一词的用途是什么?

import numpy as np

def validate_decorator(func):
    def func_wrapper(self, value):
        if value < 0:
            raise Exception("Not valid!")
        return func(self, value)
    return func_wrapper


class MyClass:
    def __init__(self):
        self.my_array = np.zeros(shape=(10,))
        self.idx = 0

    @validate_decorator
    def insert_value(self, value):
        self.my_array[self.idx] = value
        self.idx += 1
        print('EXECUTED!')

    def __str__(self):
        return f"{self.my_array[:self.idx]}"


a = MyClass()
a.insert_value(3.14)

推荐阅读