【发布时间】:2018-02-16 11:16:33
【问题描述】:
我有一个使用__slots__ 的类,并通过覆盖__setattr__ 使它们几乎不可变,以始终引发错误:
class A:
__slots__ = ['a', 'b', '_x']
def __init__(self, a, b):
object.__setattr__(self, 'a', a)
object.__setattr__(self, 'b', b)
def __setattr__(self, attr, value):
raise AttributeError('Immutable!')
@property
def x():
return self._x
@x.setter
def x(value):
object.__setattr__(self, '_x', value)
这里,“私有”属性_x 是一个占位符,用于与某些自定义硬件交互的复杂操作。
由于x 是一个属性,我希望能够做类似的事情
inst = A(1, 2)
inst.x = 3
相反,我看到我的AttributeError 带有消息Immutable!。
这里有许多明显的变通方法,例如删除自定义__setattr__(我不想这样做)或将其重写为
def __setattr__(self, attr, value):
if attr != 'x':
raise AttributeError('Immutable!')
super().__setattr__(attr, value)
这似乎是一种笨拙的方法,如果我开始添加更多类似的属性,它可能会不成比例地膨胀。
真正的问题是我不明白为什么__slots__ 和属性之间没有冲突,但__setattr__ 和属性之间存在冲突。查找顺序发生了什么,是否有另一种更优雅的解决方法来解决这个问题?
【问题讨论】:
-
NVM,看了答案就明白了……
-
@juanpa.arrivillaga。我非常乐意更改您认为我应该更改的任何措辞。
-
我觉得太早了……
标签: python python-3.x properties