Python中的公共和私有方法[重复]

Posted

技术标签:

【中文标题】Python中的公共和私有方法[重复]【英文标题】:Public and private methods in Python [duplicate] 【发布时间】:2019-08-26 18:31:09 【问题描述】:

我正在尝试将 Python 类中的公共参数更改为私有参数。据我所知,要使其私有化,我需要声明例如:

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

但是,我不知道如何使用私有属性创建私有结构,以便在公共方法中正确调用它们。

例如:

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

【问题讨论】:

如果创建属性self.__size,那么它是self.__size,而不是self.size。下划线是名称的一部分。 Python 没有私有属性。您正在使用双下划线名称修饰,这与 private 不同。按照惯例,不属于公共 api 的成员前加一个下划线。这只是一个命名约定。双下划线名称修改是为了防止 子类 中的名称冲突。 【参考方案1】:

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

我推荐阅读What is the meaning of a single and a double underscore before an object name?

通常,对于您不希望其他人在课堂之外使用的“私有”属性,惯例是在其前面加上一个下划线_,例如_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

【讨论】:

以上是关于Python中的公共和私有方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python中的私有变量和方法[重复]

Python中的私有属性和私有方法

Python中的私有构造函数

使用标准库的 Python 中的私有/公共加密

公共方法中的私有参数

私有继承导致c ++中的问题[重复]