Python中受保护变量和公共变量的区别是什么?

6
在Python中,类中的受保护变量和公共变量有什么区别?
class A:
    def __init__(self):
        self._protected="protected"
        self.__private="private"
        self.public="public"

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

有人能否解释一下区别,并指导我如何在Python中使用受保护的变量(如果我的用法是错误的)

提前感谢。

2个回答

7

除了 "public" 之外,这些术语在 Python 中并没有真正的应用。

"private" 版本只是由于名称中双下划线 __ 的 "mangling" 效果而 "起作用",但仍然可以访问它。

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

"Protected"在这里的保护机制相对较弱,像您展示的那样可以正常访问。只是约定俗成,不应使用单个下划线前缀。 在通配符导入时,单个下划线前缀有一定的影响,但我认为在属性名称中使用时没有任何影响。

Python没有"私有"类属性。可能有一些巧妙的方法来模拟它们,但充其量都是黑科技。


谢谢提供的信息。 所以我认为我们无法将变量设置为protected(请确认)。 感谢您关于访问私有变量的信息[我是从您那里学到的]。 - akhil reddy
2
如果你说的“protected”是指只能被类的子类访问,那么我不知道有没有这样的方法。当然,如果你足够有创意,可能会想出一种使用闭包或其他方式模拟受保护属性的方法,但这不是语言的特性。 - Carcigenicate

1
公共成员(通常是在类中声明的方法)可以从类外部访问。需要同一类的对象来调用公共方法。私有实例变量和公共方法的这种安排确保了数据封装的原则。
类的受保护成员可以从类内部访问,并且也可以被其子类使用。不允许其他环境访问它。这使得父类的特定资源可以被子类继承。
Python没有任何有效限制访问任何实例变量或方法的机制。Python规定将变量/方法的名称前缀为单下划线或双下划线,以模拟受保护和私有访问说明符的行为。
Python类中的所有成员默认都是公共的。可以从类环境外部访问任何成员。
在大多数情况下使用protected。不允许直接访问变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接