这种@property decorator的使用是否适合获得实例字段的良好封装?我试图实现Foobar类的客户端不能以任何方式将任意值分配给Foobar实例的字段vel
,事实上绕过属性setter方法中定义的赋值规则。
感谢。
class Foobar(object):
def __init__(self):
self._vel = 0
@property
def vel(self):
return self._vel
@vel.setter
def vel(self, v):
self._vel = v if v > 0 else 0
这个领域似乎很好地封装了。
>>> foobar = Foobar()
>>> foobar.vel
0
>>> foobar.vel = -1
>>> foobar.vel
0
>>> foobar.vel = 1
>>> foobar.vel
1
答案 0 :(得分:4)
你不能阻止用户绕过python中的任何东西。总是有一种monkeypatch / reflect / inspect属性的方法;没有对象沙盒支持。
在你的例子中:
>>> foobar._vel = -1
将完全绕过属性并直接分配给真实属性。你无法阻止它。有一些方法可以让它变得更难,但是用户可以指定她是否真的想要,那么重点是什么?
通常的方法似乎是依赖于您的图书馆用户是成年人并信任他们这一事实:
在文档中声明预期值的范围并要求用户关注。如果他们不这样做是他们的错。