我的问题非常笼统,但为了清楚起见,我想举一个尽可能具体的例子:我最近写的是一个来自matplotlib artist
的类。最小的工作示例如下:
from matplotlib import text
class TextChild(text.Text):
def __init__(self):
self._rotation = self.get_rotation()
使用下划线self._rotation
背后的想法是显示潜在用户不直接访问该属性(即将其标记为私有)。结果证明这是一个坏主意,因为text.Text
也有一个名为_rotation
的属性,我得到了非常令人惊讶的结果。
当然,有办法解决这个问题。
self._rotation2
,但是
可能,基类可能在将来发生变化
引入新的属性和一些运气不好的名字可能会
再次匹配,这会破坏派生类。self.__rotation
(我选择的解决方案)。据我所知,
但是,名称修改应尽可能少地使用,如果
我有很多私有属性会有很多双重
代码中的下划线。所以这就是问题:当从我自己的控制中派生出一个可能在将来改变的类时,是否有一种命名私有类属性的首选方法?
答案 0 :(得分:0)
在从我自己的控件中派生出一个可能在未来发生变化的类时,是否有一种命名私有类属性的首选方法?
告诉您如何在代码中选择标识符名称真的很难,这对您开放。一般来说,作为程序员,您应该避免名称冲突,一些高级IDE可以帮助您完成此过程。
对于你的问题我相信使用名称修改肯定会以某种方式避免名称冲突,这不会像你想象的那样在你的代码中乱丢,因为你明智地使用了这个功能。如果您使用了大量冗余名称,最好选择唯一的名称。通常可以使用__name
来表示您希望确保它们属于自己的类的属性,并且请记住Python中的私有不是非常私有的,它实际上是伪私有的。您仍然可以访问这些属性。
这是一个可以用来避免名称冲突的技巧:
>>> "name" in dir(Foo)
True
因此,如果name
已经存在于类Foo
的命名空间中,您可以从这一行知道并获取所有列表的属性{ {1}}只需使用Foo
作为参数dir
来调用Foo
。dir(Foo)
。
主要是这是一个设计问题,但如果我在你的位置,我会选择与dir
核对,以确保我的名字的唯一性,以避免无意中覆盖其他名称。例如,如果您阅读Python标准库的代码,在许多地方使用_name
命名约定来表示此名称不应该直接从类外部访问是非常明显的。