繁体   English   中英

从类中派生的属性命名约定,将来可能会更改

[英]Attribute naming convention when deriving from class that may change in the future

我的问题很笼统,但为清楚起见,我想举一个尽可能具体的例子:我最近正在写一门课程,该课程源于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 (我选择的解决方案)。 但是,据我了解,应该尽量少使用名称修饰,如果我有很多私有属性,则代码中会有很多双下划线。

所以这里有个问题:从我自己的控件派生而来的类(将来可能会改变)时,是否有一种命名私有类属性的首选方法?

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

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

对于您的问题,我相信使用名称修饰绝对可以避免名称冲突,这不会使您的代码带有下划线,因为您明智地使用了此功能,您可能会认为。 如果您使用大量冗余名称,则最好选择唯一名称。 通常,可以使用__name表示属性,以确保它们属于其类,并且请记住,Python中的private并不是真正的私有,而是真正的伪私有。 您仍然可以访问这些属性。

这是避免名称冲突的一种技巧:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM