我有一个像这样的python属性:
class Foo:
@property
def maxInputs(self):
return self._persistentMaxInputs.value
@maxInputs.setter
def maxInputs(self, value):
self._persistentMaxInputs.value = value
目前,每个人都可以获取并设置maxInputs
的值。
但是,我希望每个人都能获得maxInputs
的值,但只能在Foo
类中设置。
那么有没有办法用私有的setter和public getter声明一个属性?
答案 0 :(得分:4)
Python 没有隐私模型。使用下划线只是一种惯例,没有访问控制。
如果您不希望“公开”API包含设置,那么只需从您的班级中删除设置器,然后直接在您的班级代码中分配给self._persistentMaxInputs.value
。如果要限制需要记住此位置的位置数量,可以使其成为函数:
def _setMaxInputs(self, value):
self._persistentMaxInputs.value = value
你 当然可以将它作为一个单独的property
对象,但是你必须放弃装饰器语法:
def _maxInputs(self, value):
self._persistentMaxInputs.value = value
_maxInputs = property(None, _maxInputs)
但现在至少可以在类代码中使用self._maxInputs = value
。然而,这并没有提供那么多的语法改进。
答案 1 :(得分:1)
如果我拥有带有私有设置员的公共财产,我会使用两个属性。它确实创建了一些冗余代码,但最终我还是遵循了带有装饰器的约定。请参见下面的示例:
@property
def current_dir(self) -> str:
"""
Gets current directory, analogous to `pwd`
:return: Current working directory
"""
return self._current_dir
@property
def _current_dir(self) -> None:
return self._current_dir
@_current_dir.setter
def _current_dir(self, path:str) -> None:
self._current_dir = path