【发布时间】: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.setter 让MyClass 方法与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