Python是否有访问修饰符?

Python是否有访问修饰符?,python,Python,我在网上发现: public="a" # is a public variable _protected="b" # is a protected variable __private="c" # is a private variable 代码示例: class c1: def __init__(self,a,b,c): self.public=a self._protected=b self.__private=c v=c1("

我在网上发现:

public="a"  # is a public variable
_protected="b"  # is a protected variable
__private="c"  # is a private variable
代码示例:

class c1:
    def __init__(self,a,b,c):
        self.public=a
        self._protected=b
        self.__private=c
v=c1("A","B","C")
print(v.public)
v._protected="Be"   # !??? I can access a protected variable
print(v._protected)
print(v.__private)  # !??? AttributeError: 'c1' object has no attribute  '__private'

我可以访问受保护的变量

您可以访问受保护的变量,如下所示:

print(v._c1__private)
'C'

您可以通过以下方式访问受保护的变量:

print(v._c1__private)
'C'

Python没有像
private
protected
public
这样的修饰符。您可以使用
\uuuu getattr\uuuuuuu
\uuuu getattribute\uuuuuuu
模拟它们的行为,但这不是一种python式的程序编写方式

使用单个下划线<代码> 是一种约定,因此当您看到一个属性或方法从一个下划线开始时,请考虑库开发人员并不期望它是公共API的一部分。另外,当从模块导入*执行

时,Python解释器不会导入以
开头的名称,尽管有一些方法可以修改此行为

使用双下划线不仅仅是一种惯例,它会导致解释器“名称混乱”——在属性前面添加类名,因此:

class Klass():
    def __like_private():
        print("Hey!")
将使
\u Klass\u像\u private
。 您将无法按照定义直接访问
\u like\u private
,尽管您仍然可以通过在子类(例如,在模块中)中使用
\u Klass\u like\u private()
了解名称是如何组成的:

Klass.\uu like\u private()
会给你一个错误


Klass.\u Klass\u like\u private()
将打印

Python没有像
私有的
受保护的
公共的
这样的修饰符。您可以使用
\uuuu getattr\uuuuuuu
\uuuu getattribute\uuuuuuu
模拟它们的行为,但这不是一种python式的程序编写方式

使用单个下划线<代码> 是一种约定,因此当您看到一个属性或方法从一个下划线开始时,请考虑库开发人员并不期望它是公共API的一部分。另外,当从模块导入*

执行
时,Python解释器不会导入以
开头的名称,尽管有一些方法可以修改此行为

使用双下划线不仅仅是一种惯例,它会导致解释器“名称混乱”——在属性前面添加类名,因此:

class Klass():
    def __like_private():
        print("Hey!")
将使
\u Klass\u像\u private
。 您将无法按照定义直接访问
\u like\u private
,尽管您仍然可以通过在子类(例如,在模块中)中使用
\u Klass\u like\u private()
了解名称是如何组成的:

Klass.\uu like\u private()
会给你一个错误


Klass.\u Klass\u like\u private()
将打印

不,Python没有直接阻止访问的访问修饰符。但话说回来,大多数语言都没有。即使使用
保护的
私有的
关键字的语言通常也会通过内省或类似的方式以“不允许”的方式获取价值

访问修饰符以这样或那样的方式只是关于属性应该如何使用的提示


Python的理念是假设每个贡献代码的人都是负责任的成年人,并且以一个或两个下划线的形式给出的提示完全足以防止“未经授权的访问”某个属性。如果它以下划线开头,您可能不应该弄乱它。

不,Python没有直接阻止访问的访问修饰符。但话说回来,大多数语言都没有。即使使用
保护的
私有的
关键字的语言通常也会通过内省或类似的方式以“不允许”的方式获取价值

访问修饰符以这样或那样的方式只是关于属性应该如何使用的提示


Python的理念是假设每个贡献代码的人都是负责任的成年人,并且以一个或两个下划线的形式给出的提示完全足以防止“未经授权的访问”某个属性。如果它以下划线开头,您可能不应该弄乱它。

是的,您可以。请注意,您还可以动态添加/替换/删除实例和类属性(包括方法,从技术上讲,它们是类属性),甚至在运行时更改实例的类。Python没有访问修饰符。人们试图进行类比,但这是误导。是的,你可以。请注意,您还可以动态添加/替换/删除实例和类属性(包括方法,从技术上讲,它们是类属性),甚至在运行时更改实例的类。Python没有访问修饰符。人们试图进行类比,但这是误导性的。“但话说回来,大多数语言都没有。”什么语言?你懂什么编程语言?php、JAVA、C#-具有访问修饰符。甚至JavaScript在某种程度上也有访问修饰符。。。哎呀,你的“受保护的财产”来了。更不用说
(数组)$foo
,然后通过键进行拾取访问修饰符不是“安全性”。它们通常只是给程序员的提示。“但话说回来,大多数语言都不是。”什么语言?你懂什么编程语言?php、JAVA、C#-具有访问修饰符。甚至JavaScript在某种程度上也有访问修饰符。。。哎呀,你的“受保护的财产”来了。更不用说
(数组)$foo
,然后通过键进行拾取访问修饰符不是“安全性”。它们总是给程序员一些提示。