关于oop:Python公共和私有方法

Python Public and Private Methods

本问题已经有最佳答案,请猛点这里访问。

我正试图在一个Python类中将一个公共参数改为私有参数。据我所知,为了使它成为私人的,我需要声明,例如:

self.u top=无<--代替self.top=无

但是,我无法弄清楚如何使用私有属性生成私有结构,从而在公共方法中正确调用它们。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Stack:

    def __init__(self, size=None):
        self.__top = None
        if size is None:  # if size is unset
            self.__size = -1
        else:
            self.__size = size
        self.__current_size = -1

    def push(self, data):
        if self.current_size >= self.size: # ERROR!
            print("Stack Overflow!")
            return


我假设使用诸如structpublicprivate这样的术语,你一定来自C/C++的背景。在python中没有这样的东西,属性的命名是纯常规的。我建议阅读对象名称前的单下划线和双下划线的含义是什么?.

通常,对于您的"私有"属性,您不希望其他人在您的类之外使用这些属性,约定是在其前面加上一个下划线_,如_size。如果您计划在外部使用它,可以归结为以下情况:

  • 您想让它从外部可写吗?在这种情况下,您只需将其定义为size,并在任何地方使用它。
  • 您想让它从外部只读吗?在这种情况下,您可以将其设置为私有,并为其设置属性,例如:

代码:

1
2
3
4
5
6
7
8
class A:

    self __init__(self, size):
        self._size = size

    @property
    def size(self):
        return self._size

您还可以将内部变量转换为另一个名称,并使其同时在该不同名称下可写。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
class A:

    def __init__(self, value):
        self._internal_var = value

    def set_data(self, value):
        self._internal_var = value

    def get_data(self):
        return self._internal_var

    data = property(get_data, set_data)

或者:

1
2
3
4
5
6
7
@property
def data(self):
    return self._internal_var

@data.setter
def data(self, value):
    self._internal_var = value

如果你打电话:

1
2
3
4
a1 = A(11)
print(a1.data)
a1.data = 22
print(a1.data)

收益率:

1
2
11
22