Estou escrevendo um código que pega um nome de arquivo, abre o arquivo e analisa alguns dados. Eu gostaria de fazer isso em uma aula. O código a seguir 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()
Mas isso envolve colocar todo o mecanismo de análise no escopo da __init__
função da minha classe. Parece bom agora para esse código simplificado, mas a função também parse_file
possui alguns níveis de indentação. Eu preferiria definir a função parse_file()
como uma função de classe como abaixo:
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
É claro que esse código não funciona porque a função parse_file()
não está dentro do escopo da __init__
função. Existe uma maneira de chamar uma função de classe de dentro __init__
dessa classe? Ou estou pensando nisso da maneira errada?
Respostas:
Chame a função desta maneira:
Você também precisa definir sua função parse_file () assim:
O
parse_file
método deve ser vinculado a um objeto ao chamá-lo (porque não é um método estático). Isso é feito chamando a função em uma instância do objeto, no seu caso a instância éself
.fonte
Se não estou errado, ambas as funções fazem parte da sua classe, você deve usá-lo assim:
substitua sua linha:
com:
fonte
self.parse_file()
e nãoparse_file()
?def parse_file(self):
não deve ser aninhado sob a__init__
função para que você não tenha um objeto parcialmente inicializado?E se:
By the way, se você tem variáveis nomeadas
stat1
,stat2
etc., a situação está implorando por uma tupla:stats = (...)
.Portanto, vamos
parse_file
retornar uma tupla e armazenar a tuplaself.stats
.Então, por exemplo, você pode acessar o que costumava ser chamado
stat3
comself.stats[2]
.fonte
parse_file
função seja um método doMyClass
objeto. Onde seriaself
necessário?Em
parse_file
, aceite oself
argumento (assim como em__init__
). Se houver qualquer outro contexto necessário, basta transmiti-lo como argumentos adicionais, como de costume.fonte
Você deve declarar parse_file assim;
def parse_file(self)
. O parâmetro "self" é um parâmetro oculto na maioria dos idiomas, mas não no python. Você deve adicioná-lo à definição de todos os métodos que pertencem a uma classe. Em seguida, você pode chamar a função de qualquer método dentro da classe usandoself.parse_file
seu programa final ficará assim:
fonte
Eu acho que o seu problema é realmente não recuar corretamente a função init . Deve ser assim
fonte
@staticmethod
decorador em cima deparse_file
self
no seuparse_file
método.