Llamar a una función de clase dentro de __init__

5 minutos de lectura

avatar de usuario
PythonJin

Estoy escribiendo un código que toma un nombre de archivo, abre el archivo y analiza algunos datos. Me gustaría hacer esto en una clase. El siguiente código funciona:

class MyClass():
    def __init__(self, filename):
        self.filename = filename 

        self.stat1 = None
        self.stat2 = None
        self.stat3 = None
        self.stat4 = None
        self.stat5 = None

        def parse_file():
            #do some parsing
            self.stat1 = result_from_parse1
            self.stat2 = result_from_parse2
            self.stat3 = result_from_parse3
            self.stat4 = result_from_parse4
            self.stat5 = result_from_parse5

        parse_file()

Pero implica que ponga toda la maquinaria de análisis sintáctico en el ámbito de la __init__ función para mi clase. Eso se ve bien ahora para este código simplificado, pero la función parse_file tiene bastantes niveles de sangría también. Preferiría definir la función. parse_file() como una función de clase como a continuación:

class MyClass():
    def __init__(self, filename):
        self.filename = filename 

        self.stat1 = None
        self.stat2 = None
        self.stat3 = None
        self.stat4 = None
        self.stat5 = None
        parse_file()

    def parse_file():
        #do some parsing
        self.stat1 = result_from_parse1
        self.stat2 = result_from_parse2
        self.stat3 = result_from_parse3
        self.stat4 = result_from_parse4
        self.stat5 = result_from_parse5

Por supuesto, este código no funciona porque la función parse_file() no está dentro del alcance de la __init__ función. ¿Hay alguna manera de llamar a una función de clase desde dentro? __init__ de esa clase? ¿O estoy pensando en esto de la manera incorrecta?

  • ¿Hay alguna razón por la que el código de ejemplo necesite cinco versiones de “stat”? Sería más fácil de leer si hubiera solo uno.

    – 465b

    29 de abril de 2020 a las 15:23

avatar de usuario
diamante lewis

Llame a la función de esta manera:

self.parse_file()

También debe definir su parse_file() funcionar así:

def parse_file(self):

los parse_file El método debe estar vinculado a un objeto al llamarlo (porque no es un método estático). Esto se hace llamando a la función en una instancia del objeto, en su caso, la instancia es self.

  • ¡Sí! Esto era exactamente lo que estaba buscando. ¡Gracias!

    – PythonJin

    28/09/2012 a las 19:56

avatar de usuario
Paritosh Singh

Si no me equivoco, ambas funciones son parte de tu clase, deberías usarlas así:

class MyClass():
    def __init__(self, filename):
        self.filename = filename 

        self.stat1 = None
        self.stat2 = None
        self.stat3 = None
        self.stat4 = None
        self.stat5 = None
        self.parse_file()

    def parse_file(self):
        #do some parsing
        self.stat1 = result_from_parse1
        self.stat2 = result_from_parse2
        self.stat3 = result_from_parse3
        self.stat4 = result_from_parse4
        self.stat5 = result_from_parse5

reemplaza tu línea:

parse_file() 

con:

self.parse_file()

  • ¿Podría explicar por qué se debe utilizar self.parse_file() y no parse_file()?

    – ivanleoncz

    8 de agosto de 2017 a las 4:32

  • @paritoshsingh debería def parse_file(self): no estar anidado debajo del __init__ función para que no tenga un objeto parcialmente inicializado?

    – ron_g

    23 de abril de 2018 a las 19:19

  • @ivanleoncz Como parse_file es un método de instancia, necesitamos usar el objeto de referencia para llamarlo.

    – Paritosh Singh

    6 de mayo de 2018 a las 2:14

  • @rong Si este código es venerable y no desea permitir la configuración del archivo de análisis desde el exterior, sí, debe estar anidado.

    – Paritosh Singh

    6 de mayo de 2018 a las 2:24

  • Considere el uso de métodos estáticos programiz.com/python-programming/methods/built-in/staticmethod

    – Sandesh Ghanta

    29 de diciembre de 2020 a las 13:35

Qué tal si:

class MyClass(object):
    def __init__(self, filename):
        self.filename = filename 
        self.stats = parse_file(filename)

def parse_file(filename):
    #do some parsing
    return results_from_parse

Por cierto, si tienes variables nombradas stat1, stat2etc., la situación pide una tupla:
stats = (...).

Entonces deja parse_file devuelve una tupla y almacena la tupla en
self.stats.

Entonces, por ejemplo, puede acceder a lo que antes se llamaba stat3 con self.stats[2].

  • Estoy de acuerdo, solo puse self.stat1 a self.stat5 allí para mostrar que había algunas variables de clase a las que estaba asignando. En el código real tengo una solución más elegante.

    – PythonJin

    28/09/2012 a las 19:58

  • ¿Cómo debería modificarse esto si quiero parse_file función de ser un método de la MyClass objeto. Donde haría self ¿ser necesario?

    – n1k31t4

    1 de julio de 2018 a las 13:25

En parse_filetoma el self argumento (al igual que en __init__). Si hay algún otro contexto que necesite, simplemente páselo como argumentos adicionales como de costumbre.

Creo que su problema es en realidad no sangrar correctamente en eso función. Debería ser así

class MyClass():
     def __init__(self, filename):
          pass

     def parse_file():
          pass

  • Tu código tampoco. A menos que pongas el @staticmethod decorador encima de parse_file

    – rantanplan

    28/09/2012 a las 19:46


  • al menos agrega lo que falta self en tus parse_file método.

    – rantanplan

    28/09/2012 a las 19:49

  • Vaya, lo siento, debería haber una capa adicional de sangría debajo de la línea “class MyClass():”. Lo arreglé arriba, pero la pregunta sigue siendo la misma.

    – PythonJin

    28/09/2012 a las 19:55

  • Tu código tampoco. A menos que pongas el @staticmethod decorador encima de parse_file

    – rantanplan

    28/09/2012 a las 19:46


  • al menos agrega lo que falta self en tus parse_file método.

    – rantanplan

    28/09/2012 a las 19:49

  • Vaya, lo siento, debería haber una capa adicional de sangría debajo de la línea “class MyClass():”. Lo arreglé arriba, pero la pregunta sigue siendo la misma.

    – PythonJin

    28/09/2012 a las 19:55

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad