我知道,Python中没有真正的私有/受保护方法。这种方法并不意味着隐藏任何东西;我只想了解Python的功能。
class Parent(object):
def _protected(self):
pass
def __private(self):
pass
class Child(Parent):
def foo(self):
self._protected() # This works
def bar(self):
self.__private() # This doesn't work, I get a AttributeError:
# 'Child' object has no attribute '_Child__private'
那么,这种行为是否意味着“受保护”的方法将被继承,但“私有”根本不会?
还是我错过了什么?
Python没有隐私模型,没有C++、C或java等访问修改器。没有真正的“受保护”或“私有”属性。
带有前导双下划线且没有尾随双下划线的名称将被损坏,以防止在继承时发生冲突。子类可以定义自己的
__private()
方法,这些方法不会干扰父类上的相同名称。这些名称被认为是类私有的;它们仍然可以从类外部访问,但不太可能意外冲突。通过在任何这样的名称前面添加一个额外的下划线和类名(不管名称是如何使用的或是否存在),可以有效地为它们提供一个名称空间。在
Parent
类中,任何__private
标识符(在编译时)都被名称_Parent__private
替换,而在Child
类中,标识符则被_Child__private
替换,在类定义中无处不在。以下操作将起作用:
请参阅词法分析文档中的Reserved classes of identifiers:
以及引用的documentation on names:
不要使用类的私有名,除非你特别想避免告诉那些想给你的类分类的开发人员,他们不能使用特定的名称或者有破坏你的类的危险。除了已发布的框架和库之外,这个特性几乎没有用处。
PEP 8 Python Style Guide有这样一句话是关于私有名称损坏的:
还有PEP8说
按照惯例,你也应该远离
_such_methods
。我的意思是你应该把它们当作private
double
__
属性更改为_ClassName__method_name
,这使得它比_method_name
所隐含的语义隐私更为私有。从技术上讲,如果你真的愿意,你仍然可以做到这一点,但可能没有人会这么做,因此出于代码抽象的维护原因,该方法在这一点上可能是私有的。
这还有一个额外的好处(或者说是主要的好处),就是允许一个方法不与子类方法名冲突。
相关问题 更多 >
编程相关推荐