如何使用Python封装实现Stack?

How to implement Stack using Python encapsulation?

我在python中实现了Stack数据结构,其中maxsize、top、arr这些是Stackclass中的实例变量。 setter 方法改变了 maxsize 和 top 变量。在 C++ 或 Java 中,当我们定义堆栈或队列时,我们有一些私有变量,我们不想在 class 之外直接访问这些变量,并且值不应更改。通过在 class 中编写 getterssetters,我设法让变量 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=', ')