我不熟悉使用描述符,我想我对它们的工作原理有很好的理解,但我遇到了一个问题,我不知道如何解决它
class Foo:
class Bar:
def __get__(self,instance, owner):
return 10
def __set__(self,instance,value):
raise Exception
bar=Bar()
print(Foo.bar)
Foo.bar=5
print(Foo.bar)
>>> 10
>>> 5
出于测试目的,我试图将bar
设为常量,我知道property
装饰器,但我更喜欢使用描述符
首先,我打印出bar
的值,以查看__get__
是否有效-它确实有效,输出为10
但是,当我将5
分配给bar
时,预期的结果将是一个异常,但实际情况是5
被分配给bar
,尽管指定了__set__
,所以当我再次打印时,第二个输出是5
从the docs:
在代码中,
Foo.bar = 5
设置的是类属性,而不是实例属性。如果您确实使用了实例(没有首先设置Foo.bar = 5
,这会覆盖您的描述符),那么您会得到预期的异常:如果希望在设置class属性时应用
__set__
行为,则类本身需要是使用描述符的metaclass的实例:测试:
相关问题 更多 >
编程相关推荐