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

时间:2017-06-02 19:48:20

标签: python python-3.x

我的问题非常笼统,但为了清楚起见,我想举一个尽可能具体的例子:我最近写的是一个来自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(我选择的解决方案)。据我所知, 但是,名称修改应尽可能少地使用,如果 我有很多私有属性会有很多双重 代码中的下划线。

所以这就是问题:当从我自己的控制中派生出一个可能在将来改变的类时,是否有一种命名私有类属性的首选方法?

1 个答案:

答案 0 :(得分:0)

  

在从我自己的控件中派生出一个可能在未来发生变化的类时,是否有一种命名私有类属性的首选方法?

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

对于你的问题我相信使用名称修改肯定会以某种方式避免名称冲突,这不会像你想象的那样在你的代码中乱丢,因为你明智地使用了这个功能。如果您使用了大量冗余名称,最好选择唯一的名称。通常可以使用__name来表示您希望确保它们属于自己的类的属性,并且请记住Python中的私有不是非常私有的,它实际上是伪私有的。您仍然可以访问这些属性。

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

>>> "name" in dir(Foo)
True

因此,如果name已经存在于类Foo的命名空间中,您可以从这一行知道并获取所有列表的属性{ {1}}只需使用Foo作为参数dir来调用Foodir(Foo)

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