Python 如何防止直接设置实例属性?
假设我有一个甲级Python 如何防止直接设置实例属性?,python,python-3.x,oop,access-modifiers,Python,Python 3.x,Oop,Access Modifiers,假设我有一个甲级 class A: __slots__ = ['_x'] def __init__(self): self._x = 10 @property def x(self): return self._x 我想限制从除其他实例的方法之外的任何地方分配给a.x 我该怎么做?这在Python中可能吗 < >是编写一个属性只有在特定方法中才可变的类,而不是直接从外部来。 < Python没有真正的“私有”变量,如
class A:
__slots__ = ['_x']
def __init__(self):
self._x = 10
@property
def x(self):
return self._x
我想限制从除其他实例的方法之外的任何地方分配给a.x
我该怎么做?这在Python中可能吗
< >是编写一个属性只有在特定方法中才可变的类,而不是直接从外部来。
< Python没有真正的“私有”变量,如C++。即使通过使用前缀from将变量设置为private(如您所做的)。您始终可以使用
A.\u x
访问变量
如果出于某种原因想要模拟私有变量,可以使用\uuu
(双下划线)前缀,因为它会损坏名称。类似地,您可以使用@property
decorator生成getter和setter函数,并阻止对属性的访问。但是,即使这些也会失败,因为您可以使用\uuuu dict\uuuu
直接访问变量
所以蟒蛇式的方法就是保持原样。Python在这方面与perl类似。要解释Perl书中关于隐私的一句名言
哲学是你不应该呆在客厅里,因为
你没有被邀请,不是因为有人用猎枪保护你
我完全同意@kinshukdua的观点。不过,我只是想探索更多可供您选择的选项。您可以通过设置一些条件来覆盖设置属性 这可能不是最具python风格的方式,但我愿意用一种更干净的方式来实现这一点
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
这回答了你的问题吗?嗯,我对Python并不完全陌生,并且熟悉这种哲学。然而,在这个特殊的案例中,我正在寻找一种解决方法。这是你想做的事,只是因为。作为练习:)但我想如果可能的话,它已经实施了。谢谢你阻止我浪费时间:)我真的想到了元编程来解决这个问题。类似于创建一个元类,该元类为其创建锁对象和上下文管理器,并将其附加到类实例,然后重写setattr magic方法,这样,只有在打开锁的情况下才能添加和分配属性。在“new”调用期间执行所有这些操作,然后在init或其他方法调用期间使用锁分配其他属性。