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旋转
\u name
,您希望确保这些属性属于它们的类,请记住Python中的private不是真正的private,而是真正的伪private。您仍然可以访问这些属性
这里有一个技巧可以用来避免名称冲突:
>>> "name" in dir(Foo)
True
因此,如果类Foo
的名称空间中已经存在name
,那么您可以从这一行中知道,要获得类Foo
的所有属性的列表,只需调用dir
,并将Foo
作为其参数:dir(Foo)
这主要是一个设计问题,但如果我处在您的位置,我会选择使用dir
来确保我的名字的唯一性,以避免无意中覆盖其他名字。例如,如果您阅读Python标准库的代码,在许多地方使用\u name
命名约定来表示此名称不应直接从类外部访问是非常明显的