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.

Cómo obtener la clase del objeto que se está creando en los parámetros de __init__

Así que estoy tratando de crear una clase con un método de inicialización que necesita obtener el tipo del objeto que se está creando para configurar correctamente los valores predeterminados de los argumentos init.

Para dar un ejemplo concreto con código, digamos que tengo la siguiente clase:

def __init__(self, foo, bar=type(self).some_class_variable, ham=type(self).some_other_class_variable):
    self.foo = foo
    self.bar = bar
    self.ham = self.some_function(ham)

Esta es la funcionalidad que estoy buscando, pero mi IDE está diciendo “self” no está definido, lo cual puedo entender, ya que “self” aún no ha sido instanciado. Entonces mi pregunta es, ¿cómo puedo implementar esto correctamente? No quiero “codificar” el tipo de clase en donde actualmente tengo “type(self)” porque las subclases de esta clase pueden tener sus propios valores para “some_class_variable” y “some_other_class_variable” y quiero que esas subclases utilicen la variable de clase correspondiente a su tipo.

Mi solución debe funcionar en Python 3.6 y Python 3.7, pero preferiría encontrar una solución que funcione en todas las versiones de Python 3.6 y posteriores si es posible.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para establecer correctamente los valores predeterminados de los argumentos de inicialización basados en el tipo del objeto que se está creando, puedes usar __class__ en lugar de type(self) en el método de inicialización.

    Aquí tienes un ejemplo de código actualizado que utiliza __class__:

    def __init__(self, foo, bar=None, ham=None):
        self.foo = foo
        self.bar = bar or self.__class__.some_class_variable
        self.ham = self.some_function(ham or self.__class__.some_other_class_variable)
    

    El uso de __class__ permite que la subclase acceda a sus propias variables de clase y valores predeterminados al instanciar sus propios objetos.

    Ten en cuenta que también es una buena práctica proporcionar valores predeterminados sensatos para los argumentos bar y ham en caso de que no se proporcionen durante la inicialización. En el código actualizado, bar y ham tienen como valor predeterminado None si no se proporcionan valores.

Comments are closed.