问题描述
class A:
__slots__ = ['_x']
def __init__(self):
self._x = 10
@property
def x(self):
return self._x
并且我想限制从其他实例的方法以外的任何地方分配给 a._x
。
我该怎么做?这在 Python 中是可能的吗?
问题是编写一个类,该类的属性只能在特定方法内更改,而不能直接从外部更改。
解决方法
Python 并没有像 C++ 这样的“私有”变量。即使您使用 PEP8 中的 _
前缀将变量设置为私有(正如您所做的那样)。您始终可以使用 A._x
访问该变量。
如果您出于某种原因想要模拟私有变量,您可以使用 __
(双下划线)前缀,因为它会破坏名称。同样,您可以使用 @property
装饰器来创建 getter 和 setter 函数并防止访问该属性。但是,即使这些也失败了,因为您可以使用 __dict__
直接访问变量。
所以 Pythonic 的方式是保持原样。 Python 在这方面就像 perl。套用 Perl 书中关于隐私的一句名言,
哲学是你应该远离客厅,因为 你没有被邀请,不是因为它被霰弹枪防守。
,我完全同意@kinshukdua 的观点。但是,只是为了探索更多可用的选项。您可以通过放置一些条件来覆盖 setattr
这可能不是最 Pythonic 的方式,但我愿意采用更简洁的方式来实现这一点。
class A:
_x = 10 #dont think you need an init method since you are not adding any data
def __setattr__(self,key,value):
if 'yes' in value[1]:
super().__setattr__(key,value[0])
else:
raise TypeError('You should not have access to this')
def change(self,value,loc= 'yes'):
self._x = value,loc
return self._x