Я хочу реализовать стек в Python3, и для некоторых методов, которые должны проверять пустой стек или полный стек, я хочу написать декораторы, которые позаботились бы о проверке того же самого и могли бы использоваться для различных методов, которые нуждаются в этих проверках.
Это то, что я пытался сделать (пожалуйста, проверьте реализацию методов push и pop):
repl.it link: 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