如何在Python中封装实例字段
使用@property装饰器来很好地封装实例字段,这样做合适吗?我想确保Foobar类的使用者不能随意给Foobar实例的vel
字段赋值,这样就不会绕过在属性设置方法中定义的赋值规则。
谢谢。
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
1 个回答
4
在Python中,你无法阻止用户绕过任何限制。总是有办法去修改、反射或者检查属性;而且没有对象沙箱的支持。
在你的例子中:
>>> foobar._vel = -1
这会完全绕过属性,直接给真实的属性赋值。你根本无法阻止这种情况。虽然有一些方法可以让这变得更难,但如果用户真的想要赋值,他们总是能做到,那这样做有什么意义呢?
通常的做法是相信使用你库的用户都是成年人,并且信任他们:
在文档中说明预期的值范围,并要求用户遵循。如果他们不遵守,那就是他们自己的问题。