Python 从将来可能更改的类派生时的属性命名约定

Python 从将来可能更改的类派生时的属性命名约定,python,python-3.x,Python,Python 3.x,我的问题很笼统,但为了清楚起见,我想举一个尽可能具体的例子:我最近在写一个类,它是从一个matplotlib艺术家派生的。最简单的工作示例如下: from matplotlib import text class TextChild(text.Text): def __init__(self): self._rotation = self.get_rotation() 使用下划线self.\u旋转的想法是向潜在用户显示不直接访问该属性(即将其标记为私有)。这原来是个坏

我的问题很笼统,但为了清楚起见,我想举一个尽可能具体的例子:我最近在写一个类,它是从一个
matplotlib艺术家
派生的。最简单的工作示例如下:

from matplotlib import text

class TextChild(text.Text):
    def __init__(self):
        self._rotation = self.get_rotation()
使用下划线
self.\u旋转
的想法是向潜在用户显示不直接访问该属性(即将其标记为私有)。这原来是个坏主意,因为
text.text
还有一个名为
\u rotation
的属性,我得到了非常令人惊讶的结果

当然,有办法解决这个问题

  • 一种是使用不同的属性名,比如说,
    self.\u rotation2
    ,但是 基类可能会在将来发生更改 引入新的属性和一些运气不好的名字可能会 再次匹配,这将破坏派生类
  • 另一个解决方案是使用名称混乱,即。
    self.\uu旋转
    (我选择的解决方案)。据我了解,, 但是,名称损坏应尽可能少地使用,如果 我有很多私人属性,会有很多双重属性 代码中的下划线
所以这里有一个问题:当从我自己控制之外的类派生时,有没有一种命名私有类属性的首选方法,将来可能会发生变化

当从我自己控制之外的类派生时,是否有命名私有类属性的首选方法,将来可能会发生变化

很难告诉您应该如何在代码中选择标识符的名称,这对您是开放的。一般来说,作为程序员,避免名称冲突是你的工作,一些高级IDE可以在这个过程中提供帮助

对于您的问题,我相信使用名称混乱一定会以某种方式避免名称冲突,这不会像您明智地使用此功能时所认为的那样在代码中乱加下划线。如果使用了大量冗余名称,最好选择唯一的名称。通常可以对属性使用
\u name
,您希望确保这些属性属于它们的类,请记住Python中的private不是真正的private,而是真正的伪private。您仍然可以访问这些属性

这里有一个技巧可以用来避免名称冲突:

>>> "name" in dir(Foo)
True
因此,如果类
Foo
的名称空间中已经存在
name
,那么您可以从这一行中知道,要获得类
Foo
的所有属性的列表,只需调用
dir
,并将
Foo
作为其参数:
dir(Foo)

这主要是一个设计问题,但如果我处在您的位置,我会选择使用
dir
来确保我的名字的唯一性,以避免无意中覆盖其他名字。例如,如果您阅读Python标准库的代码,在许多地方使用
\u name
命名约定来表示此名称不应直接从类外部访问是非常明显的