Как переопределить вложенные «точечные» операторы? - PullRequest
0 голосов
/ 18 января 2020

Если я использую __getattr__ и вызываю a.b.c, где a - это экземпляр моего класса, тогда я получаю "b" внутри __getattr__, что означает, что мне также нужна рекурсия для отмены доступа к c. Но если рекурсия, я не буду знать, какой вызов является последним, поэтому я не буду знать, когда возвращать окончательное значение, т.е. не могу различить guish между a.b и (a.b).c

Как преодолеть?

Как получить всю цепочку "b", "c" в переопределенной операции?


Например, A - это мой класс, тогда предположим, что я хочу быть:

a = A()

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

et c.

Т.е. я хочу переопределить каждую комбинацию самостоятельно.

1 Ответ

0 голосов
/ 18 января 2020

Получение атрибута 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"
...