首页 > 解决方案 > 如何覆盖嵌套的“点”运算符?

问题描述

如果我使用__getattr__并调用a.b.cwherea是我的类的一个实例,那么我就"b"进入了__getattr__,这意味着我也需要递归来覆盖访问c。但是如果递归,我不知道,哪个调用是最后一个,所以我不知道,什么时候返回最终值,即无法区分a.b(a.b).c

如何克服?

如何在覆盖操作中获得整个链“b”、“c”?


例如,A 是我的班级,那么假设我想成为:

a = A()

print(a.b)  # prints "hello"
print(a.b.c) # prints "hi"

等等

即我想自己覆盖每个组合。

标签: pythonoperator-overloading

解决方案


获取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"

推荐阅读