python中受保护变量和公共变量有啥区别

Posted

技术标签:

【中文标题】python中受保护变量和公共变量有啥区别【英文标题】:What is the difference between protected and public variable in pythonpython中受保护变量和公共变量有什么区别 【发布时间】:2020-12-06 20:18:17 【问题描述】:

在python中,类中的protected变量和public变量有什么区别

class A:
    def __init__(self):
        self._protected="protected"
        self.__private="private"
        self.public="public"

>>> a = A()
>>> a.public
'public'
>>> a._protected
'protected'
>>> 

谁能解释一下区别,并指导我如何在python中使用受保护的变量[如果我的方法是错误的]

提前致谢。

【问题讨论】:

【参考方案1】:

除了“public”之外,这些术语都不适用于 Python。

由于__ 对名称的影响,“私人”版本只能“工作”,但仍然可以访问它。

>>> a = A()
>>> print(a._A__private)
private

这里的“受保护”是更弱的“保护”。如您所见,可以正常访问。只有按照惯例,不应使用单个下划线前缀。 A single underscore prefix has some effect when wildcard importing, 但我认为它在属性名称中使用时没有任何效果。

Python 没有“私有”类属性。可能有一些模仿它们的巧妙方法,但它们充其量只是 hack。

【讨论】:

感谢您的信息。所以我认为我们无法将变量设置为受保护的(请确认)感谢有关访问私有变量的信息[我只从你那里了解到] @akhilreddy 如果通过“受保护”,您的意思是只能由类的子类访问,不,我不知道。当然,如果你有足够的创造力,你可能会想出一个 hack,使用闭包或其他东西来模拟受保护的属性,但这不是该语言的特性。【参考方案2】:

公共成员(通常是在类中声明的方法)可以从类外部访问。调用公共方法需要同一类的对象。这种私有实例变量和公有方法的排列保证了数据封装的原则。

类的受保护成员可以从类内部访问,并且也可供其子类使用。不允许其他环境访问它。这使得父类的特定资源可以被子类继承。

Python 没有任何机制可以有效地限制对任何实例变量或方法的访问。 Python 规定了使用单下划线或双下划线作为变量/方法名称前缀的约定,以模拟受保护和私有访问说明符的行为。

默认情况下,Python 类中的所有成员都是公共的。可以从类环境之外访问任何成员。

在大多数情况下使用受保护。不允许直接访问变量。

【讨论】:

以上是关于python中受保护变量和公共变量有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

c ++中受保护的派生和私有派生有啥区别[重复]

“受保护”和“受保护静态”变量有啥区别?

Java 枚举类型中受保护的变量是啥意思? [复制]

如何影响派生类中受保护的基变量

“私有”、“公共”和“受保护的方法”之间有啥区别?

.Net中受保护的内部意味着啥[重复]