我在网上发现:
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'
我可以访问受保护的变量!?你知道吗
您可以访问受保护的变量:
Python没有像
private
、protected
、public
这样的修饰符。你可以用__getattr__
和__getattribute__
来模拟它们的行为,但这不是一种Pythonic方式来编写程序。你知道吗使用单下划线
_
是一种惯例,因此当您看到一个属性或方法以一个下划线开头时,请考虑库开发人员不希望它成为公共API的一部分。另外,在执行from module import *
时,Python解释器不会导入以_
开头的名称,尽管有一些方法可以修改此行为。你知道吗使用双下划线
__
不仅仅是一种惯例,它会导致解释器“名称混乱”——在属性前面添加类名,例如:将使
_Klass__like_private
。 您将无法按照定义直接访问__like_private
,尽管您仍然可以通过在子类中使用_Klass__like_private()
来了解名称是如何组成的,例如在子类中或在模块中:Klass.__like_private()
会给你一个错误。你知道吗Klass._Klass__like_private()
将打印Hey!
。你知道吗不,Python没有直接阻止访问的访问修饰符。但话说回来,大多数语言都不是这样的。即使是使用
protected
和private
关键字的语言,通常也会通过内省或类似的方式,以“不应该被允许”的方式获得价值访问修饰符以这样或那样的方式只是关于属性应该如何使用的提示。你知道吗
Python的理念是假设每个贡献代码的人都是负责任的成年人,并且以一个或两个下划线的形式给出的提示足以防止“未经授权的访问”属性。如果它以下划线开头,你可能不应该弄乱它。你知道吗
相关问题 更多 >
编程相关推荐