python - 如何将类的实例作为参数传递给装饰类中定义的实例方法的装饰器?

标签 python python-3.x stack python-decorators

我想在Python3中实现一个Stack,对于一些需要检查Stack Empty或Stack Full的方法,我想编写装饰器来负责检查相同的内容,并可用于需要这些检查的各种方法。

这是我尝试做的(请检查push和pop方法的实现):

repl.it 链接:https://repl.it/@Ishitva/Stack

class StackFullException(Exception):
    pass

class StackEmptyException(Exception):
    pass

def checkStackFull(instance):
    def check(func):
        def execute(*args, **kwargs):
            if len(instance.items) <= instance.limit:
                return func(*args, **kwargs)
            raise StackFullException

        return execute
    return check

def checkStackEmpty(instance):
    def check(func):
        def execute(*args, **kwargs):
            if len(instance.items) > -1:
                return func(*args, **kwargs)
            raise StackEmptyException

        return execute
    return check


class Stack():

    def __init__(self, limit=10):
        self.items = []
        self.limit = limit

    @checkStackFull(self)
    def push(item):
        self.items.append(item)
        return item

    @checkStackEmpty(self)
    def pop():
        return self.items.pop()

    def getSize():
        return len(self.items)

这给了我以下异常:

Traceback (most recent call last):
  File "main.py", line 28, in <module>
    class Stack():
  File "main.py", line 34, in Stack
    @checkStackFull(self)
NameError: name 'self' is not defined

最佳答案

但是如果你确实需要这样做,那么编码:

class StackFullException(Exception):
    pass

class StackEmptyException(Exception):
    pass


def checkStackFull(func):
    def execute(self, *args, **kwargs):
        if len(self.items) <= self.limit:
            return func(self, *args, **kwargs)
        raise StackFullException()

    return execute


def checkStackEmpty(func):
    def execute(self, *args, **kwargs):
        if len(self.items):
            return func(self, *args, **kwargs)
        raise StackEmptyException()
    return execute


class Stack():
    def __init__(self, limit=10):
        self.items = []
        self.limit = limit

    @checkStackFull
    def push(self, item):
        self.items.append(item)
        return item

    @checkStackEmpty
    def pop(self):
        return self.items.pop()

    def getSize(self):
        return len(self.items)

顺便说一下,从空列表中弹出无论如何都会引发 IndexError,所以你可以使用它。

关于python - 如何将类的实例作为参数传递给装饰类中定义的实例方法的装饰器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53928764/

相关文章:

python - 围绕中心单元旋转 3x3 阵列的每个单元的模块(不是矩阵旋转)

python-3.x - 将移位计数有效地应用于 DataFrame

python - 读取为 NoneType 的 txt 行

PHP - 启用错误堆栈跟踪

python - 基于同一模型中其他字段的django字段验证器

python - 系统范围的 matplotlib 后端选择取决于显示可用性

python - 使用 bash 在各自的选项卡中启动我的所有服务器

python - Seaborn 错误?热图绘制不一致

c++ - 扩展 std::unordered_set<> 以与 std::stack<> 一起使用

c - 在堆栈上使用 realloc()