为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

偶然的你 2021-09-25 21:04:33
我想在 Python3 中实现一个 Stack,对于一些需要检查 Stack Empty 或 Stack Full 的方法,我想编写装饰器来处理相同的检查并且可用于需要这些检查的各种方法。这是我尝试做的(请检查 push 和 pop 方法的实现):repl.it 链接:https ://repl.it/@Ishitva/Stackclass StackFullException(Exception):    passclass StackEmptyException(Exception):    passdef checkStackFull(instance):    def check(func):        def execute(*args, **kwargs):            if len(instance.items) <= instance.limit:                return func(*args, **kwargs)            raise StackFullException        return execute    return checkdef checkStackEmpty(instance):    def check(func):        def execute(*args, **kwargs):            if len(instance.items) > -1:                return func(*args, **kwargs)            raise StackEmptyException        return execute    return checkclass 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
查看完整描述

1 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

但如果你真的需要这样做,那么代码:


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 所以你可以使用它。


查看完整回答
反对 回复 2021-09-25
  • 1 回答
  • 0 关注
  • 235 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信