如何解决如何使用 __get__ 和 __set__python 描述符 谁能告诉我为什么没有引发错误?
我是使用描述符的新手,我认为我对它们的工作方式有很好的了解,但我遇到了一个问题,我不知道如何解决。
代码
class Foo:
class Bar:
def __get__(self,instance,owner):
return 10
def __set__(self,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
,尽管指定了 {{1}所以当我再次打印时,第二个输出是 __set__
。
谁能告诉我为什么没有引发错误?
解决方法
来自the docs:
object.__set__(self,instance,value)
调用以将所有者类的实例 instance
上的属性设置为新值 value
。
在您的代码中,Foo.bar = 5
正在设置类属性,而不是实例属性。如果您确实使用了一个实例(没有首先设置 Foo.bar = 5
,它会覆盖您的描述符),那么您会按预期收到异常:
>>> f = Foo()
>>> f.bar
10
>>> f.bar = 5
Traceback (most recent call last):
File "<stdin>",line 1,in <module>
File "<stdin>",line 6,in __set__
Exception
如果您希望在设置类属性时应用 __set__
行为,则类本身需要是使用描述符的 metaclass 的实例:
class FooMeta(type):
class Bar:
def __get__(self,owner):
return 10
def __set__(self,value):
raise Exception
bar = Bar()
class Foo(metaclass=FooMeta):
pass
测试:
>>> Foo.bar
10
>>> Foo.bar = 5
Traceback (most recent call last):
File "<stdin>",in __set__
Exception
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。