【发布时间】:2016-01-26 21:33:43
【问题描述】:
假设我有一个简单的类Foo,它来自外部库,因此我无法直接更改它:
class Foo(object):
def __init__(self, x):
self.x = x
我想创建一个子类Bar 并防止x 从Bar 的实例更改,但仍使用Bar 的方法中的x。
这是我尝试过的,它可能会启发基本思想,但不幸的是它不起作用:
class Bar(Foo):
@property
def x(self):
return super().x
@x.setter
def x(self, value):
raise NotImplementedError('Do not change x directly, use "do_stuff()" instead')
def do_stuff(self, value):
if <something>:
super().x = value
所以基本上我已经围绕一个属性创建了一些包装函数 (do_stuff()),现在我想防止直接更改该属性,因为它可能会弄乱包装函数的某些功能。这是否可能以合理的方式进行?
编辑用一个更好的例子来说明我想要什么。我并不是要阻止他们看到变量 x,而是从 do_stuff() 之外更改它
【问题讨论】:
-
所以你不想直接访问变量但想在函数中使用。我理解正确吗?
-
@udhy 是的,完全正确。我想阻止 其他人 在实例化
Bar后访问该属性。因此,当有人使用bar = Bar(4); bar.x = 5时,它会引发错误并告诉他们改用do_stuff()。 -
Foo.__init__拥有对x的所有其他访问权限。除非您明确检查 如何x被分配,例如与inspect,我不明白你怎么能做到这一点。我们都是同意的成年人,所以真的不支持像这样锁定东西。 -
@jonrsharpe 我想这是对我的“这可能以合理的方式吗?”的一个“否”。太糟糕了,虽然我真的不认为这是可能的。不过,值得一问!
标签: python class python-3.x inheritance