Pergunta

Eu gostaria de criar uma classe filha que tivesse um método da classe pai onde o método fosse um 'método de classe' na classe filha, mas não na classe pai.

Essencialmente, estou tentando realizar o seguinte:

class foo(Object):
    def meth1(self, val):
        self.value = val

class bar(foo):
    meth1 = classmethod(foo.meth1)
Foi útil?

Solução

Também não tenho certeza de qual é o comportamento exato que você deseja, mas supondo que você deseja que bar.meth1(42) seja equivalente a foo.meth1 sendo um método de classe de bar (com "self" sendo a classe), então você pode conseguir isso com:

def convert_to_classmethod(method):
    return classmethod(method.im_func)

class bar(foo):
    meth1 = convert_to_classmethod(foo.meth1)

O problema com classmethod(foo.meth1) é que foo.meth1 já foi convertido em um método, com um significado especial para o primeiro parâmetro.Você precisa desfazer isso e observar o objeto de função subjacente, reinterpretando o que "self" significa.

Eu também alertaria que isso é uma coisa muito estranha de se fazer e, portanto, pode causar confusão para qualquer pessoa que leia seu código.Provavelmente é melhor você pensar em uma solução diferente para o seu problema.

Outras dicas

O que você está tentando realizar?Se eu visse tal construção no código Python ao vivo, consideraria vencer o programador original.

A questão, tal como colocada, parece-me bastante estranha:Não vejo por que alguém iria querer fazer isso.É possível que você esteja entendendo mal o que é um "método de classe" em Python (é um pouco diferente de, digamos, um método estático em Java).

Um método normal é mais ou menos apenas uma função que toma como primeiro argumento (geralmente chamado de "self"), uma instância da classe, e que é invocada como ".".

Um modelo de classe é mais ou menos apenas uma função que toma como seu primeiro argumento (geralmente chamado de "CLS"), uma classe, e que pode ser invocada como "". Ou como ".".

Com isso em mente e com o código mostrado acima, o que você esperaria que acontecesse se alguém criasse uma instância de bar e chamasse meth1 nela?

bar1 = bar()
bar1.meth1("xyz")

Quando o código para meth1 é chamado, são passados ​​​​dois argumentos 'self' e 'val'.Eu acho que você espera que "xyz" seja passado por 'val', mas o que você acha que é passado por 'self'?Deveria ser a instância bar1 (neste caso, nenhuma substituição foi necessária)?Ou deveria ser a barra de classe (o que esse código faria então)?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top