如何防止直接设置实例属性



假设我有一个a类

class A:
__slots__ = ['_x']
def __init__(self):
self._x = 10

@property
def x(self):
return self._x

我想从除其他实例的方法之外的任何地方重新引用分配给a._x

我该怎么做?这在Python中可能吗?

问题是要编写一个类,该类的属性只能在特定方法内更改,而不能直接从外部更改。

Python并没有真正的"私人的";像C++这样的变量。即使您使用PEP8中的_前缀将变量设置为private(正如您所做的那样(。您始终可以使用A._x访问变量。

如果出于某种原因想要模拟私有变量,可以使用__(双下划线(前缀,因为它会破坏名称。类似地,您可以使用@property装饰器来生成getter和setter函数,并阻止对属性的访问。但是,即使这样也会失败,因为您可以直接使用__dict__访问变量。

所以Python的方法是保持原样。Python在这方面就像perl。借用Perl书中关于隐私的一句名言

哲学是你应该远离客厅,因为你没有被邀请,不是因为有人用猎枪防守。

我完全同意@kinshukdua的观点。然而,只是为了探索更多可供选择的选项。您可以通过放置一些条件来覆盖setattr

这可能不是最蟒蛇的方式,但我愿意用一种更干净的方式来实现这一点。

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



相关内容

  • 没有找到相关文章

最新更新