Python中真的没有封装[重复]

Posted

技术标签:

【中文标题】Python中真的没有封装[重复]【英文标题】:Isn't really there encapsulation in Python [duplicate] 【发布时间】:2017-02-18 04:56:57 【问题描述】:

所以今天我问Python中是否有类似Protected成员类的东西,很多人说没有类似PublicProtectedPrivate这样的东西。但我编写了以下代码来测试:

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中真的没有封装[重复]的主要内容,如果未能解决你的问题,请参考以下文章

关于自动化过程中函数的封装

Python封装及解构

Python封装函数:实现删除一个list里面的重复,且元素顺序要与原list顺序对应

python3检查列表、元组、字符串中的重复元素

python连接mysql与方法的封装

超好用超短的小程序请求封装