首页 > 解决方案 > Public and private methods in Python

问题描述

I am trying to change a public to private parameter inside a Python class. As far as I know, to make it private I need to declare for instance:

self.__top = None # <-- Instead of self.top = None

However, I cannot figure out how to make a private struct with private properties, such that they are called properly in the public methods.

For instance:

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

标签: pythonoopstackprivatepublic

解决方案


我假设通过使用诸如structpublicprivate之类的术语,您必须来自C / C++背景。Python中没有这样的东西,属性的命名纯属约定俗成。

我建议阅读对象名称前的单下划线和双下划线是什么意思?.

通常,对于您不希望其他人在您的班级之外使用的“私有”属性,约定是在其前面加上一个下划线_,例如_size. 如果您打算在外面使用它,则归结为以下几种情况:

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

代码:

class A:

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

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

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

例子:

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)

或者:

@property
def data(self):
    return self._internal_var

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

然后如果你打电话

a1 = A(11)
print(a1.data)
a1.data = 22
print(a1.data)

它将产生:

11
22

推荐阅读