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

在Python中,内部属性的备份存储的首选命名约定是什么?,python,properties,Python,Properties,假设您有一个Python中的公共方法,其主要目的是检索底层数据属性(即内部备份存储)的值。该方法可能具有惰性计算逻辑等。属性就是此类方法的一个示例 然后,除了数据属性的下划线前缀外,方法和数据属性使用相同的名称是很自然的。比如说-- (来自) 但是,如果该方法是供内部使用的,并且它本身以下划线作为前缀,那么有哪些首选约定呢?用两个前导下划线作为后备存储的前缀会导致名称混乱,因此并不理想 可能有两种可能性-- Python风格说第二个(添加下划线)只应用于避免与保留关键字冲突。如果是内部使用,为什

假设您有一个Python中的公共方法,其主要目的是检索底层数据属性(即内部备份存储)的值。该方法可能具有惰性计算逻辑等。属性就是此类方法的一个示例

然后,除了数据属性的下划线前缀外,方法和数据属性使用相同的名称是很自然的。比如说--

(来自)

但是,如果该方法是供内部使用的,并且它本身以下划线作为前缀,那么有哪些首选约定呢?用两个前导下划线作为后备存储的前缀会导致名称混乱,因此并不理想

可能有两种可能性--


Python风格说第二个(添加下划线)只应用于避免与保留关键字冲突。

如果是内部使用,为什么要将其作为属性?如果是内部使用,只需直接访问该属性


但是你仍然会使用一个下划线,但称它为其他的东西。但是,在这种情况下,使其成为属性的全部意义都丢失了。

首选的约定是使用一个前导下划线

这是对私有属性的建议

请参见属性()的docstring中的此示例:


如果它需要执行逻辑,比如惰性求值,你会想把它变成一个属性。然后你可以直接调用这个方法,当它是内部的。-1因为这不是一个答案,虽然我最初误读了这个问题,所以给了你错误的答案@克里斯·J有一个很好的答案。不要惹伦纳德的人。@Hamish Grubijan,我相信它的意思是“吵闹的苏格兰人”或“红脖子苏格兰人”。我很高兴评论不能得-1分。我认为拥有私人财产会让很多人感到困惑。我建议您从调用的
属性
派生您自己的类,可能是
缓存的\u属性
,并定义
\uuuu get\uuu
,以便它调用尚未调用的getter,如果已经调用,则返回调用时返回的值。然后定义
\uuuu delete\uuuu
来忘记缓存的值。我只是为自己写了一个,看看是否可以做到。确实可以,但是有点难看,需要使用弱引用,这意味着属性所在的类必须是弱引用。
class C(object):
def __init__(self):
    self._x = None

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

def _x(self):
    return self._x_
>>> 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
 |