【问题标题】:Naming private properties in Python在 Python 中命名私有属性
【发布时间】:2017-11-12 01:04:03
【问题描述】:

我的问题与this one 几乎相同,但它看起来像一个死线,我想问的问题看起来有点隐蔽。

问题:如果我想使用@property 来制作private 属性,我应该如何命名底层变量?

代码:

# I want to replace "NAME" with something.
class MyClass(object):
  def __init__(self, x):
    self.NAME = x

  @property
  def _x(self):
    validate_x_get()
    return self.NAME

  @_x.setter
  def _x(self, val):
    validate_x_set(val)
    self.NAME = val

  ...

说明:我想使用@property@valname.setterMyClass 方法与self.NAME 很好地配合使用。链接问题的答案通常说只制作私人 getter 和 setter,但感觉就像should be a better way

讨论:

  • NAME 的自然名称是_x,但这会使self._x 无限递归。
  • x 会公开,这不是我想要的。
  • __x 似乎是对 mangling 的滥用,这是为了防止子类化问题。
  • _x_private_stored_x_my_x 都是不愉快的。

有什么建议吗?

【问题讨论】:

  • 类似this?
  • Python 并没有真正私有属性。只需在您的属性名称前加上一个_ 下划线,您就有了“约定的隐私”。你说你觉得_x_private 不愉快,但你应该期望它不愉快,因为 Python 不是为具有私有属性而设计的。对我来说,这似乎是最好的解决方案,所以,我认为你还不如处理不愉快的事情
  • 这似乎完全基于意见,尤其是因为您似乎很了解各种标准和选项。
  • 是的,由开发人员决定 _x_ 是否比 _px 或您列出的示例更有意义。我认为与您选择的任何内部方案保持一致更为重要。

标签: python


【解决方案1】:

只是总结一下讨论:

  • 这主要是基于意见的,因为 Python 的“私有”是约定俗成的;
  • 可读可理解一致的任何解决方案都足够好。

本着这种精神,我将提倡在我的代码库中使用 _x_(最少的额外字符)。感谢所有评论者。

【讨论】:

    猜你喜欢
    • 2014-06-19
    • 2013-01-02
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多