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?

Foi útil?

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()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top