【问题标题】:Isn't really there encapsulation in Python [duplicate]Python中真的没有封装[重复]
【发布时间】: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 行为,或者是否有可能。

感谢和问候。

【问题讨论】:

    标签: python


    【解决方案1】:

    Python 类中没有公共、私有或受保护的东西。私有方法和值通常以_ 下划线为前缀,作为一种约定,以提示其他开发人员不应直接访问它。但是,没有任何机制可以阻止您简单地访问这些成员。

    双下划线约定(__init____lt__ 等)通常由 Python 本身用于设置特定的模块级或类级变量。这些有时称为"magic methods"

    【讨论】:

    • 正如我所提到的,我做了一些测试,双下划线不允许我从其他模块或类访问该变量,除非我使用了 setter 函数......
    • 您没有展示如何尝试打印双下划线值。很可能您访问不正确。
    • 我很确定它是对的......也许它与python版本有关?我正在使用 3.5.2
    【解决方案2】:

    带有双下划线前缀的属性被破坏,但它们不是私有的。您仍然可以使用car._Vehiculo__peso = 20,这将成功设置“私有”变量。

    【讨论】:

    • 我试过了,还是没变
    • 那你做了一些不同的事情。
    猜你喜欢
    • 1970-01-01
    • 2012-08-11
    • 2018-09-20
    • 1970-01-01
    • 2011-10-23
    • 2021-05-04
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    相关资源
    最近更新 更多