Estou com problemas para resolver um problema de recursão. Como posso criar uma classe que se comporte assim:
- imprima os atributos solicitados:
o.foo.bar
imprimiria"o.foo.bar"
quando chamado. - a mesma coisa para uma função:
o.foo.bar(True)
->"o.foo.bar(True)"
. - esta chamada de atributo retornará um valor quando chamada, por exemplo "1".
O código ficaria assim:
>>> o = MyClass()
>>> result = o.foo.bar
"o.foo.bar"
>>> print(result)
1
Tentei algumas coisas, __getattr__
mas não consigo lidar com a recursão corretamente. Não consigo saber quando o fim da cadeia aninhada foi alcançado e então retornar o resultado com precisão.
Foi o mais perto que cheguei:
class MyClass:
def __init__(self):
self.a = []
def __getattr__(self, name):
self.a.append(name)
print(self.a)
return self
o = MyClass()
result = o.foo.bar
PROPÓSITO
Este é um código simplificado para eliminar a complexidade do contexto. Atualmente, estou tentando encapsular a API JS do Photoshop, e isso poderia ajudar a chamar as funções do software escrevendo as mesmas funções da API em Python. O print
seria substituído por uma chamada ao Servidor PS e o result
pelo resultado real da chamada.
O principal problema aqui é que você não pode chamar
o.foo.bar
, porque os atributos de um objeto de função só são acessados quando:Eles são definidos como atributos de instância (
self.bar
)O método que define o atributo foi chamado previamente, trazendo-o à existência
Portanto, você não pode realmente atingir seu objetivo aqui, porque a lógica básica de acesso a atributos dentro de uma classe não é respeitada quando você digita
o.foo.bar
.