Python是否有访问修饰符?

2024-04-24 10:24:39 发布

您现在位置: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("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'

我可以访问受保护的变量!?你知道吗


Tags: 代码self示例initisdefbeprivate
3条回答

您可以访问受保护的变量:

print(v._c1__private)
'C'

Python没有像privateprotectedpublic这样的修饰符。你可以用__getattr____getattribute__来模拟它们的行为,但这不是一种Pythonic方式来编写程序。你知道吗

使用单下划线_是一种惯例,因此当您看到一个属性或方法以一个下划线开头时,请考虑库开发人员不希望它成为公共API的一部分。另外,在执行from module import *时,Python解释器不会导入以_开头的名称,尽管有一些方法可以修改此行为。你知道吗

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

class Klass():
    def __like_private():
        print("Hey!")

将使_Klass__like_private。 您将无法按照定义直接访问__like_private,尽管您仍然可以通过在子类中使用_Klass__like_private()来了解名称是如何组成的,例如在子类中或在模块中:

Klass.__like_private()会给你一个错误。你知道吗

Klass._Klass__like_private()将打印Hey!。你知道吗

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

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

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

相关问题 更多 >