Python属性范围最佳实践

Python属性范围最佳实践,python,pep8,Python,Pep8,一位经验丰富的工程师告诉我,在类中定义方法和变量时,不要使用双下划线,因为它们是为神奇的方法保留的,只使用一个下划线。我知道双下划线使属性成为类的私有属性,而单下划线使它们受到保护。我也明白受保护的属性只是开发人员之间的相互理解。我发现很难相信不使用私有属性,那么为什么要首先创建这个概念呢。因此,我的问题是: 即使将属性设置为非公共属性是有意义的,使用双下划线真的是一种糟糕的做法吗? 既然受保护的属性并没有得到真正的保护,那么仅仅将其私有化是否有意义呢?因为这样做会减少错误? 以下是对您陈述的一

一位经验丰富的工程师告诉我,在类中定义方法和变量时,不要使用双下划线,因为它们是为神奇的方法保留的,只使用一个下划线。我知道双下划线使属性成为类的私有属性,而单下划线使它们受到保护。我也明白受保护的属性只是开发人员之间的相互理解。我发现很难相信不使用私有属性,那么为什么要首先创建这个概念呢。因此,我的问题是:

即使将属性设置为非公共属性是有意义的,使用双下划线真的是一种糟糕的做法吗? 既然受保护的属性并没有得到真正的保护,那么仅仅将其私有化是否有意义呢?因为这样做会减少错误?
以下是对您陈述的一些更正,希望能够澄清您的问题:

魔法方法和属性的前缀和后缀为双下划线。前缀中只有一个双下划线专门用于将内容私有化

在Python3及更高版本中,仅以双下划线作为前缀的属性的名称会被破坏,从而使它们更私有。您将无法使用文字名称在类之外访问它们。这可能会导致类之外的问题,因此不要对模块级属性使用双下划线前缀:。但是,一定要在课堂上使用它们,让事情变得私密。如果不打算使用该特性,就不会将其添加到Python中

一般来说,就隐私和保护而言,Python中没有这样的概念。这只是一种期望,面向对象的程序员来自其他语言,因此有一种已建立的将属性标记为私有的约定

单下划线前缀通常是将事物标记为私有的首选方式,因为它不会损坏名称,从而使隐私权由API的用户决定。这种隐私/保护实际上更多的是表明该属性是一个实现细节,在未来的版本中可能会更改。没有任何东西可以阻止您使用该属性,尤其是当您的代码被链接到不同版本的库时,如果您不介意代码被破坏的话

请记住,对于给定版本的Python,即使是损坏的名称也遵循固定模式。破坏的目的更多的是防止您意外地覆盖您不想覆盖的内容,而不是使属性真正私有化。它只是在属性名中添加带有一组下划线的类名,因此如果您知道如何访问,仍然可以直接访问它


这里有一个很好的描述,描述了我刚从文档中写下的几乎所有内容:

这完全取决于你说的是前导双下划线,例如_uuufoo,还是前导和尾随,例如_uuufoo。@Mitch只是前导双下划线,不引导和跟踪在这种情况下,它将与魔法方法冲突的断言是错误的。魔术方法使用前导和尾随下划线,因此不会发生冲突。但是,这里有一个不同的理由不使用它们@PaulRooney Hi Paul,问题2受保护和私有属性的实际使用情况如何,因为私有属性防止意外访问,如果一直使用private而不是在protectedattributeshi@JETM中相互理解来解释作用域的含义,这难道没有意义吗?我已经在问题描述中表达了这一点。谢谢。这回答了我的问题。非常感谢!另外,请阅读以下帖子:@teddybear123。如果此答案对您有帮助,请单击投票按钮下的复选标记选择此答案。