es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

método de fábrica de Python relativo a la propia instancia, (¿método de clase también usando self como argumento?)

Así que tengo este fragmento de código originalmente,

“`python
class Foo:
def <strong>init</strong>(self, val:int):
self.val = val

<pre><code>def next(self) -> Foo:
"""
Returns:
Foo: Foo con valor 1 más grande que el actual
"""
return Foo(self.val+1)
</code></pre>

“`
En el que el método next() genera otra instancia de Foo basada en la instancia actual.

Hasta ahora funciona bien, pero luego he leído sobre métodos estáticos y métodos de clase en python, y parecía que debería utilizar un método de clase para next(), ya que es un método de fábrica (¡por favor, indícame si entendí mal la idea!)

¿Cuál sería la forma más elegante de implementar lo anterior?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, tienes razón. El método next() es un método de fábrica y puede implementarse de manera más elegante utilizando un método de clase. Aquí tienes una implementación de ejemplo utilizando un método de clase:

    class Foo:
        def __init__(self, val:int):
            self.val = val
    
        @classmethod
        def create(cls) -> 'Foo':
            """
            Devuelve:
                Foo: Foo con un valor 1 mayor que el actual
            """
            return cls(cls.val+1)
    

    En esta implementación, utilizamos el método de clase create() en lugar de next(). El método create() toma la clase cls como su primer argumento en lugar de self. Esto nos permite crear una nueva instancia de la misma clase desde dentro del método de clase.

    Dentro del método create(), usamos cls en lugar de Foo para crear una nueva instancia de la clase. cls se refiere a la clase real que está llamando al método, y Foo es solo un nombre de marcador de posición. Esto significa que si heredas de Foo, el método create() devolverá una instancia de la subclase en lugar de Foo.

    En general, esta implementación es más elegante y sigue los buenos principios de programación orientada a objetos.

Comments are closed.