您描述它的方式绝对不可能。分配名称是Python的基本功能,并且没有提供任何钩子来更改其行为。
但是,可以通过覆盖来控制对类实例中成员的分配.__setattr__()。
class MyClass(object):
def __init__(self, x):
self.x = x
self._locked = True
def __setattr__(self, name, value):
if self.__dict__.get("_locked", False) and name == "x":
raise AttributeError("MyClass does not allow assignment to .x member")
self.__dict__[name] = value
>>> m = MyClass(3)
>>> m.x
3
>>> m.x = 4
Traceback (most recent call last):
File "", line 1, in
File "", line 7, in __setattr__
AttributeError: MyClass does not allow assignment to .x member
请注意,有一个成员变量_locked,它控制是否允许分配。您可以解锁它以更新值。