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
,然后通过键进行拾取访问修饰符不是“安全性”。它们总是给程序员一些提示。