在python中没有封装吗

Isn't really there encapsulation in Python

本问题已经有最佳答案,请猛点这里访问。

所以今天我问在python中是否有类似于Protected的成员类,很多人说这里没有类似于PublicProtectedPrivate的类。但我编写了以下代码来测试这一点:

1
2
3
4
class Vehiculo():

    def __init__(self, peso):
        self.__peso = peso

我从一个外族人那里得到了:

1
2
car = Vehiculo(10)
car.__peso = 20

打印出来的仍然是10,所以这就像Private,但是当我用一个下划线更改类变量时:

1
2
3
4
class Vehiculo():

        def __init__(self, peso):
            self._peso = peso

而是印了20张。有人能给我解释清楚吗?我读过一篇非常相似的文章(很多人认为是重复的),但我不明白他们怎么说。这正是PublicPrivate的行为。我想知道如何做一个Protected行为,或者是否可能。

谢谢你。


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

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


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