Tengo un método en uno de mis objetos que devuelve una nueva instancia de esa misma clase. Intento descubrir la forma más idiomática de escribir este método de manera que genere un nuevo objeto del mismo tipo sin duplicar el código.Idiomatic Python para generar un nuevo objeto desde una clase
Dado que este método utiliza datos de la instancia, mi primer paso es:
class Foo(object):
def get_new(self):
data = # Do interesting things
return Foo(data)
Sin embargo, si subclase de Foo y no anula las get_new, llamando get_new en SubFoo devolvería un Foo! Por lo tanto, podría escribir un classmethod:
class Foo(object):
@classmethod
def get_new(cls, obj):
data = # Munge about in objects internals
return cls(data)
Sin embargo, los datos que estoy accediendo es específico del objeto, por lo que parece romper la encapsulación para que esto no sea un método "normal" (sin decoración). Además, debe llamarlo como SubFoo.get_new(sub_foo_inst)
, lo que parece redundante. Me gustaría que el objeto simplemente "sepa" qué tipo devolver, ¡del mismo tipo que él!
Supongo que también es posible agregar un método de fábrica a la clase y anular el tipo de devolución en todas partes, sin duplicar la lógica, pero eso parece poner mucho trabajo en las subclases.
Entonces, mi pregunta es, ¿cuál es la mejor manera de escribir un método que proporcione flexibilidad en el tipo de clase sin tener que anotar el tipo por todas partes?
classmethods mismos no son muy idiomáticos en Python; las fábricas pueden ser funciones simples que viven en el mismo módulo que la clase. –
@Adam: los métodos de clase tienen sus usos (por ejemplo, cuando se usan variables de clase y no se quiere romper la herencia). Los métodos estáticos son mucho peores. – delnan