Invocando os métodos de classe de uma superclasse em Python
-
26-09-2019 - |
Pergunta
Estou trabalhando em uma extensão de frasco que adiciona suporte ao CouchDB ao Flask. Para facilitar, eu subclassei couchdb.mapping.Document
então o store
e load
Os métodos podem usar o banco de dados local atual. No momento, meu código se parece com o seguinte:
class Document(mapping.Document):
# rest of the methods omitted for brevity
@classmethod
def load(cls, id, db=None):
return mapping.Document.load(cls, db or g.couch, id)
Deixei de fora um pouco por brevidade, mas essa é a parte importante. No entanto, devido à maneira como o modelo de classe funciona, quando tento chamar esse método, recebo a mensagem de erro
File "flaskext/couchdb.py", line 187, in load
return mapping.Document.load(cls, db or g.couch, id)
TypeError: load() takes exactly 3 arguments (4 given)
Eu testei substituindo a chamada com mapping.Document.load.im_func(cls, db or g.couch, id)
, e funciona, mas não estou particularmente feliz em acessar o interno im_
atributos (mesmo que estejam documentados). Alguém tem uma maneira mais elegante de lidar com isso?
Solução
Eu acho que você realmente precisa usar super
aqui. Essa é a maneira mais intensa de chamar métodos de superclasse de qualquer maneira:
class A(object):
@classmethod
def load(cls):
return cls
class B(A):
@classmethod
def load(cls):
# return A.load() would simply do "A.load()" and thus return a A
return super(B, cls).load() # super figures out how to do it right ;-)
print B.load()