我在python中实现了Stack的数据结构,其中maxsize、top和arr是Stack类中的实例变量,maxsize和top变量是通过setter方法来改变的。就像在C++或Java中,当我们定义堆栈或队列时,我们有一些私有变量,我们不希望在类外直接访问这些变量,而且这些变量的值不应该改变。变量top和maxsize,我通过写下 获取者 和 设置者 的类中。
如何在Python中实现同样的事情,即持有堆栈元素的实例变量arr不能在类外使用object改变。
有什么方法可以让 胳肢窝 还是需要在Python中使用其他本地数据类型来实现Stack?
Stack的实现。
class Stack:
def __init__(self, maxsize):
self.maxsize = maxsize
self.top = -1
self.arr = []
@property
def maxsize(self):
return self.__maxsize
@maxsize.setter
def maxsize(self, maxsize):
if maxsize < 1:
maxsize = 1
if not getattr(self, 'maxsize', None):
self.__maxsize = maxsize
@property
def top(self):
return self.__top
@top.setter
def top(self, top):
if getattr(self, 'top', -1) < self.maxsize and top < self.maxsize and top >= -1:
if abs(getattr(self, 'top', -1) - top) in (0, 1):
self.__top = top
def is_empty(self):
return self.top == -1
def is_full(self):
return self.top == self.maxsize - 1
def push(self, ele):
if self.is_full():
return
self.top += 1
self.arr.append(ele)
return ele
def pop(self):
if self.is_empty():
return
ele = self.arr[self.top]
del self.arr[self.top]
self.top -= 1
return ele
def display(self):
print(*self.arr, sep=', ')
s = Stack(10)
s.push(23)
s.push(45)
s.push(34)
print("before changing arr >>>>> ")
s.display()
s.arr = [3,3,3,3,3,3,3,3] # this line breaking the stack implementation
# either it should raise error or should not change the
# value of variable which holding stack elements
print("after changing arr >>>>> ")
s.display()
输出。
before changing arr >>>>>
23, 45, 34
after changing arr >>>>>
3, 3, 3, 3, 3, 3, 3, 3
改变 self.arr
到 self.__arr
类中的各个地方。你不需要创建一个setter或getter,因为你不想在类外暴露这个。
class Stack:
def __init__(self, maxsize):
self.maxsize = maxsize
self.top = -1
self.__arr = []
@property
def maxsize(self):
return self.__maxsize
@maxsize.setter
def maxsize(self, maxsize):
if maxsize < 1:
maxsize = 1
if not getattr(self, 'maxsize', None):
self.__maxsize = maxsize
@property
def top(self):
return self.__top
@top.setter
def top(self, top):
if getattr(self, 'top', -1) < self.maxsize and top < self.maxsize and top >= -1:
if abs(getattr(self, 'top', -1) - top) in (0, 1):
self.__top = top
def is_empty(self):
return self.top == -1
def is_full(self):
return self.top == self.maxsize - 1
def push(self, ele):
if self.is_full():
return
self.top += 1
self.__arr.append(ele)
return ele
def pop(self):
if self.is_empty():
return
ele = self.__arr[self.top]
del self.__arr[self.top]
self.top -= 1
return ele
def display(self):
print(*self.__arr, sep=', ')