如何在Python中覆盖嵌套的“点”运算符?

问题描述 投票:0回答:1

[如果我使用__getattr__并调用a.b.c,其中a是我的类的实例,那么我会在"b"内部获得__getattr__,这意味着我也需要递归以覆盖对c的访问。但是如果递归,我将不知道哪个调用是最后一次调用,所以我也不知道何时返回最终值,即无法区分a.b(a.b).c

如何克服?

如何在重写操作中获得整个链“ b”,“ c”?

python operator-overloading
1个回答
0
投票

获取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"
© www.soinside.com 2019 - 2024. All rights reserved.