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 me involucra poner toda la maquinaria de análisis en el alcance de la __init__
función para mi clase. Ahora se ve bien para este código simplificado, pero la función también parse_file
tiene bastantes niveles de sangría. Prefiero 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?
Respuestas:
Llame a la función de esta manera:
También necesita definir su función parse_file () de esta manera:
El
parse_file
método tiene que 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 esself
.fuente
Si no me equivoco, ambas funciones son parte de tu clase, deberías usarla así:
reemplace su línea:
con:
fuente
self.parse_file()
y noparse_file()
?def parse_file(self):
no debe estar anidado bajo la__init__
función para que no tenga un objeto parcialmente inicializado?Qué tal si:
Por cierto, si usted tiene variables con nombre
stat1
,stat2
etc., la situación está pidiendo una tupla:stats = (...)
.Entonces,
parse_file
devuelva una tupla y almacene la tuplaself.stats
.Entonces, por ejemplo, se puede acceder a lo que solía ser llamado
stat3
conself.stats[2]
.fuente
parse_file
función sea un método delMyClass
objeto? ¿Dónde seríaself
necesario?En
parse_file
, tome elself
argumento (como en__init__
). Si necesita algún otro contexto, simplemente páselo como argumentos adicionales como de costumbre.fuente
Debe declarar parse_file de esta manera;
def parse_file(self)
. El parámetro "self" es un parámetro oculto en la mayoría de los idiomas, pero no en python. Debe agregarlo a la definición de todos los métodos que pertenecen a una clase. Luego puede llamar a la función desde cualquier método dentro de la clase usandoself.parse_file
su programa final se verá así:
fuente
Creo que su problema es en realidad no sangrar correctamente la función init . Debería ser así
fuente
@staticmethod
decorador encima deparse_file
self
en tuparse_file
método.