如何使用Python封装实现Stack?
How to implement Stack using Python encapsulation?
我在python中实现了Stack数据结构,其中maxsize、top、arr这些是Stackclass中的实例变量。
setter 方法改变了 maxsize 和 top 变量。在 C++ 或 Java 中,当我们定义堆栈或队列时,我们有一些私有变量,我们不想在 class 之外直接访问这些变量,并且值不应更改。通过在 class 中编写 getters 和 setters,我设法让变量 top 和 maxsize 表现得像私有变量。
我怎样才能在 Python 中实现同样的事情,即保存堆栈元素的实例变量 arr 不能在 class using 对象之外更改。
有什么方法可以让 arr 变量成为私有变量吗?或者其他一些本机数据类型需要用于 Python?
中的 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
更改为 self.__arr
。您不需要创建 setter 或 getter,因为您不想在 class.
之外公开它
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=', ')
我在python中实现了Stack数据结构,其中maxsize、top、arr这些是Stackclass中的实例变量。 setter 方法改变了 maxsize 和 top 变量。在 C++ 或 Java 中,当我们定义堆栈或队列时,我们有一些私有变量,我们不想在 class 之外直接访问这些变量,并且值不应更改。通过在 class 中编写 getters 和 setters,我设法让变量 top 和 maxsize 表现得像私有变量。
我怎样才能在 Python 中实现同样的事情,即保存堆栈元素的实例变量 arr 不能在 class using 对象之外更改。
有什么方法可以让 arr 变量成为私有变量吗?或者其他一些本机数据类型需要用于 Python?
中的 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
更改为 self.__arr
。您不需要创建 setter 或 getter,因为您不想在 class.
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=', ')