É possÃvel acessar a instância do objeto em uma função anotada @classmethod do Python quando a chamada ocorre por meio da própria instância e não da classe?
class Foo(object):
def __init__(self, text):
self.text = text
@classmethod
def bar(cls):
return None
print(Foo.bar())
foo = Foo('foo')
# If possible, I'd like to return "foo"
print(foo.bar())
Estou trabalhando em torno das limitações de uma biblioteca que chama um método de classe por meio da instância (em vez da classe) e esperava poder contornar o fato de que só consigo acessar a classe em bar(cls)
(eu teria que acessar a instância para acessar .text
). Não acho que isso seja possÃvel, mas pensei em perguntar (também não consegui descobrir nada na internet para uma solicitação tão especÃfica).
Uma abordagem possÃvel sem modificação
Foo
é definirbar
como um método de instância de uma subclasse, mas usar um descritor personalizado para fazer com que o acesso ao atributo ao método retorne o método de classe do mesmo nome da superclasse quando o atributo for acessado da classe, quando a instância passada__get__
forNone
:Demonstração: https://ideone.com/yVAzr3
EDIT: Já que você esclareceu no comentário que tem controle total sobre
Foo
, você pode modificarFoo.bar
diretamente para que seja um descritor personalizado cujo__get__
método chama um método de classe ou um método de instância com base na condição mencionada acima.Por conveniência, criei o descritor como um decorador que decora um método de classe com um
instancemethod
método adicional que pode decorar um método de instância:Demonstração: https://ideone.com/PmSnUC