【问题标题】:In Python, what is a preferred naming convention for the backing store of an internal property?在 Python 中,内部属性的后备存储的首选命名约定是什么?
【发布时间】:2011-01-11 12:26:34
【问题描述】:

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

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

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

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

(来自Python's "property" documentation

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

可能有两种可能——

def _get_x(self):
    return self._x

def _x(self):
    return self._x_

不过,Python 风格表示第二个(附加下划线)只能用于避免与保留关键字发生冲突。

【问题讨论】:

  • 我很高兴 cmets 不能有 -1 的分数。
  • 我认为拥有私有财产会让很多人感到困惑。我建议从property 派生你自己的类,也许是cached_property,并定义__get__ 让它调用getter,如果它还没有调用getter,如果它有,返回它时返回的值被称为。并定义__delete__ 忘记缓存的值。
  • 我只是为自己写了一个,看看能不能完成。确实可以,但是有点难看,并且需要使用弱引用,这意味着属性所在的类必须是弱引用的。

标签: python properties


【解决方案1】:

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

这是针对私有属性的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
 |  

【讨论】:

    【解决方案2】:

    如果它是供内部使用的,您为什么要将其设为属性?如果是内部使用,直接访问属性即可。

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

    【讨论】:

    • 如果需要执行逻辑,例如惰性求值,您可能希望将其设为属性。
    • 然后你可以直接调用那个方法,当它是内部的时候。
    • -1 因为这不是答案,尽管我最初误读了这个问题,因此给了你错误的答案。 @Chris J 有一个很好的答案。
    • 别惹Lennart的人。
    • @Hamish Grubijan,我相信它的意思是“粗鲁的苏格兰人”或“红脖子的苏格兰人”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 2014-02-10
    • 1970-01-01
    相关资源
    最近更新 更多