python - 设置类属性不使用描述符设置器
问题描述
问题:类属性显然不访问描述符的__set__
方法。这是预期的还是有问题?
下面的代码演示了这个问题。代码直接来自Python 文档。
class RevealAccess:
"""A data descriptor that sets and returns values
normally and prints a message logging their access.
"""
def __init__(self, initval=None, name='var'):
self.val = initval
self.name = name
def __get__(self, obj, objtype):
print('Retrieving', self.name)
print(f'obj = {obj}')
print(f'objtype = {objtype}')
return self.val
def __set__(self, obj, val):
print('Updating', self.name)
self.val = val
class MyReveal:
x = RevealAccess(10, 'var "x"')
创建实例的行为符合预期:
>>> mr = MyReveal()
>>> mr.x
Retrieving var "x"
obj = <__main__.MyReveal object at 0x139246eb8>
objtype = <class '__main__.MyReveal'>
>>> mr.x = 'set mr.x'
Updating var "x"
Retrieving var "x"
obj = <__main__.MyReveal object at 0x139246eb8>
objtype = <class '__main__.MyReveal'>
直接在类属性上使用时,其__get__
行为符合预期:
>>> MyReveal.x
Retrieving var "x"
obj = None
objtype = <class '__main__.MyReveal'>
MyReveal.x=set mr.x
但是,当尝试设置时,__set__
似乎被忽略了,并且该属性被覆盖,丢失了描述符:
>>> MyReveal.x = 'set MyReveal.x'
<no output>
>>> MyReveal.x
'set MyReveal.x'
>>> mr.x
'set MyReveal.x'
正如所见,来自描述符的诊断信息消失了,只剩下x
属性的值只是裸露的 str。
这是预期的行为吗?或者,更有可能的是,我做错了什么?或者,一个错误?
解决方案
推荐阅读
- qt - 锁定 OpenMP
- python - 有没有办法只在 Counter() 输出中打印字典?
- javascript - 如何通过将html复制为另一个div中的文本来获取新行
- laravel - Laravel View to PDF:ol 的问题(有序列表)
- node.js - 获取打字稿错误(TS2430 和 TS2344):接口“响应”
' 错误地扩展接口 'ServerResponse' - ruby-on-rails - 没有路由匹配缺少必需的键:[:id]。破坏
- git - git index-pack 在 Ubuntu 20.04 中的 chromium 构建期间失败
- swiftui - SwiftUI:在工作表中更改亮/暗模式不会刷新工作表 UI
- botframework - 无法连接到远程机器人技能?
- xpath - Mule 3.9 - 无法使用 Xpath3 NODESET 的 foreach 获取 xml 值