Pregunta

Me gustaría hacer un niño de la clase que tiene un método de la clase padre, donde el método es un "classmethod' en la clase hija, pero no en la clase padre.

Esencialmente, estoy tratando de lograr lo siguiente:

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

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

Solución

Tampoco estoy totalmente seguro de lo que el comportamiento exacto que usted desea es, pero asumiendo su que desee de la barra.meth1(42) a ser el equivalente a los foo.meth1 ser un classmethod de bar (con "uno mismo" ser la clase), entonces usted puede lograr esto con:

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

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

El problema con classmethod(foo.meth1) es que foo.meth1 ya se ha convertido en un método, con un significado especial para el primer parámetro.Usted necesita para deshacer este y mirar el subyacente objeto de la función, la reinterpretación de lo "auto" significa.

Me gustaría también advierten que este es un bonito y lo impar, y por lo tanto susceptible de causar confusión a nadie la lectura de su código.Usted es probablemente mejor de pensamiento a través de una diferente solución a su problema.

Otros consejos

¿Qué estás tratando de lograr?Si he visto una construcción en la que vive el código de Python, me gustaría considerar la posibilidad de batir el programador original.

La cuestión, tal como se plantea, parece bastante extraño para mí:No veo por qué alguien querría hacer eso.Es posible que usted se malentendido qué es un "classmethod" es en Python (es un poco diferente de, digamos, un método estático en Java).

Un método normal es más o menos sólo una función que toma como primer argumento (generalmente denominado "auto"), una instancia de la clase, y que es invocado como ".".

Un classmethod es más o menos sólo una función que toma como primer argumento (a menudo llamado "cls"), una clase, y que puede ser invocado como "." O como ".".

Con esto en mente, y el código que se muestra arriba, lo que se puede esperar que suceda si alguien crea una instancia de la barra y pide meth1 en él?

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

Cuando el código meth1 se llama, se pasan dos argumentos 'yo' y 'val'.Supongo que espera que "xyz" para ser pasado por 'val', pero en qué estás pensando pasa por 'auto'?Debe ser el bar1 instancia (en este caso, no se puede anular era necesario)?O debería ser la clase de la barra (lo que luego sería este código lo HACEN)?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top