在Python中,内部属性的备份存储有什么命名约定?

11 投票
2 回答
2725 浏览
提问于 2025-04-15 18:42

假设你在Python中有一个公开的方法,它的主要作用是获取一个内部数据属性的值(也就是存储数据的地方)。这个方法可能会有延迟计算的逻辑等等。属性就是这样一个方法的例子。

在这种情况下,给这个方法和数据属性使用相同的名字是很自然的,只不过数据属性前面加一个下划线。例如--

class C(object):
def __init__(self):
    self._x = None

@property
def x(self):
    """I'm the 'x' property."""
    return self._x

(来自 Python的“property”文档)

但是如果这个方法是内部使用的,并且本身也以下划线开头,那么有什么推荐的命名规则呢?如果把存储数据的属性前面加两个下划线,就会触发名字重整,这样就不太理想了。

有两个可能的选择--

def _get_x(self):
    return self._x

def _x(self):
    return self._x_

根据Python的风格,第二种选择(在名字后面加一个下划线)应该只在避免与保留关键字冲突时使用。

2 个回答

0

为什么要把它设成属性,如果只是内部使用的话?如果只是内部用,直接访问这个属性就行了。

不过这样的话,你还是会用一个下划线,但叫个不同的名字。不过,这样一来,把它设成属性的意义就没了。

6

推荐的写法是用一个下划线开头。

这是PEP 8对私有属性的建议。

可以看看这个关于property()的例子:

>>> help(property)
Help on class property in module builtins:

class property(object)
 |  property(fget=None, fset=None, fdel=None, doc=None) -> property attribute
 |  
 |  fget is a function to be used for getting an attribute value, and likewise
 |  fset is a function for setting, and fdel a function for del'ing, an
 |  attribute.  Typical use is to define a managed attribute x:
 |  class C(object):
 |      def getx(self): return self._x
 |      def setx(self, value): self._x = value
 |      def delx(self): del self._x
 |      x = property(getx, setx, delx, "I'm the 'x' property.")
 |  
 |  Decorators make defining new properties or modifying existing ones easy:
 |  class C(object):
 |      @property
 |      def x(self): return self._x
 |      @x.setter
 |      def x(self, value): self._x = value
 |      @x.deleter
 |      def x(self): del self._x
 |  

撰写回答