Python属性范围最佳实践

时间:2017-02-22 16:48:19

标签: python pep8

一位非常有经验的工程师告诉我永远不要使用双下划线来定义类中的方法和变量,因为它们是为魔术方法保留的,只使用单个下划线。我理解双重下划线使属性对类是私有的,并且单个下划线使它们受到保护。我也明白受保护的属性只是开发人员之间的相互理解。我发现很难相信不使用私有属性,那么为什么首先创建这个概念。所以我的问题是:

  • 即使将属性设为非公开是有意义的,使用双下划线是否真的是不好的做法?
  • 由于受保护的属性“没有真正受到保护”,将它设为私有是否有意义,因为这样做会有较少的错误?

1 个答案:

答案 0 :(得分:1)

以下是对您的陈述的一些更正,希望澄清您的要求:

魔术方法和属性以双下划线为前缀和后缀。仅在前缀中的双下划线专门用于使事物变得私密。

在Python 3及更高版本中,仅以双下划线为前缀的属性会使其名称受损,使其更加私密。您将无法使用文字名称在课堂外访问它们。这可能会导致类外的问题,因此不要使用双下划线前缀来表示模块级属性:How to access private variable of Python module from class。但是,请在类中使用它们来使事情变得私密。如果不打算使用该功能,则不会将其添加到Python中。

就隐私和保护而言,Python中没有这样的概念。只是期望面向对象的程序员从其他语言进入,所以有一个已建立的约定将属性标记为私有的约定。

单下划线前缀通常是将事物标记为私有的首选方式,因为它不会破坏名称,由API的用户自行决定保留隐私。这种隐私/保护实际上更多地表明该属性是一个可能在未来版本中发生变化的实现细节。没有什么可以阻止您使用该属性,尤其是当您的代码在与不同版本的库链接时可以正常运行时。

请记住,即使是受损的名称也遵循给定版本的Python的固定模式。修剪更多是为了防止你意外地覆盖你不想要的东西,而不是让属性真正私密。它只是在您的属性名称中添加了带有一堆下划线的类名,因此如果您知道如何,仍然可以直接访问它。

以下是对我刚从文档中写下的所有内容的一个很好的描述:https://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-references