Python中真的没有封装[重复]
Posted
技术标签:
【中文标题】Python中真的没有封装[重复]【英文标题】:Isn't really there encapsulation in Python [duplicate] 【发布时间】:2017-02-18 04:56:57 【问题描述】:所以今天我问Python中是否有类似Protected
成员类的东西,很多人说没有类似Public
Protected
或Private
这样的东西。但我编写了以下代码来测试:
class Vehiculo():
def __init__(self, peso):
self.__peso = peso
我从外部类中做到了:
car = Vehiculo(10)
car.__peso = 20
它打印的仍然是 10,所以这就像 Private
,但是当我只用一个下划线更改类变量时:
class Vehiculo():
def __init__(self, peso):
self._peso = peso
改为打印 20。有人可以清楚地向我解释吗?我读过一篇非常相似的帖子(许多人认为是重复的),但我不明白他们在说什么。这正是 Public
Private
行为。而且我想知道如何执行Protected
行为,或者是否有可能。
感谢和问候。
【问题讨论】:
【参考方案1】:Python 类中没有公共、私有或受保护的东西。私有方法和值通常以_
下划线为前缀,作为一种约定,以提示其他开发人员不应直接访问它。但是,没有任何机制可以阻止您简单地访问这些成员。
双下划线约定(__init__
、__lt__
等)通常由 Python 本身用于设置特定的模块级或类级变量。这些有时称为"magic methods"。
【讨论】:
正如我所提到的,我做了一些测试,双下划线不允许我从其他模块或类访问该变量,除非我使用了 setter 函数...... 您没有展示如何尝试打印双下划线值。很可能您访问不正确。 我很确定它是对的......也许它与python版本有关?我正在使用 3.5.2【参考方案2】:带有双下划线前缀的属性被破坏,但它们不是私有的。您仍然可以使用car._Vehiculo__peso = 20
,这将成功设置“私有”变量。
【讨论】:
我试过了,还是没变 那你做了一些不同的事情。以上是关于Python中真的没有封装[重复]的主要内容,如果未能解决你的问题,请参考以下文章