python - 如何覆盖嵌套的“点”运算符?
问题描述
如果我使用__getattr__
并调用a.b.c
wherea
是我的类的一个实例,那么我就"b"
进入了__getattr__
,这意味着我也需要递归来覆盖访问c
。但是如果递归,我不知道,哪个调用是最后一个,所以我不知道,什么时候返回最终值,即无法区分a.b
和(a.b).c
如何克服?
如何在覆盖操作中获得整个链“b”、“c”?
例如,A 是我的班级,那么假设我想成为:
a = A()
print(a.b) # prints "hello"
print(a.b.c) # prints "hi"
等等
即我想自己覆盖每个组合。
解决方案
获取b属性可以动态创建某些东西的实例:
class A:
def __getattr__(self, name):
if name == "b":
return B()
raise AttributeError(name)
class B:
def __getattr__(self, name):
if name == "c":
return "hi"
raise AttributeError(name)
a = A()
print(a.b.c)
# -> "hi"
推荐阅读
- node.js - 打字稿语法相关
- python - 你如何从文本文件python中删除数字最大的行?
- computer-vision - 大图像上的风格转移。(成块?)
- laravel - Laravel Vue.js - 服务器重新启动后,帐户不会注销
- javascript - Web 组件中自定义元素的构造函数限制
- postgresql-9.1 - PostgreSQL 触发器中的唯一约束冲突
- docker - GitLab 管道 Docker 构建卡在 apk 上
- ios - UILabel 无法正确更新
- python - 使用 pygame 自动进行半圆形路径移动
- python - 如何在 pydantic 模型中解析 ObjectId?