__init__ 내부에서 클래스 함수 호출


132

파일 이름을 가져 와서 파일을 열고 일부 데이터를 파싱하는 코드를 작성 중입니다. 나는 이것을 수업 시간에하고 싶다. 다음 코드가 작동합니다.

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()

그러나 그것은 모든 파싱 기계를 __init__수업 의 기능 범위에 두는 것과 관련이 있습니다. 이 단순화 된 코드에서는 이제는 괜찮아 보이지만 함수 parse_file에는 몇 가지 수준의 indention도 있습니다. 함수를 parse_file()아래와 같이 클래스 함수로 정의하고 싶습니다.

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

물론이 코드는 함수 parse_file()가 함수 범위 내에 있지 않기 때문에 작동하지 않습니다 __init__. __init__해당 클래스 내에서 클래스 함수를 호출하는 방법이 있습니까? 아니면 내가 잘못 생각하고 있습니까?


코드 예제에 "stat"의 5 가지 버전이 필요한 이유가 있습니까? 하나만 있으면 쉽게 읽을 수 있습니다.
465b

답변:


183

이 방법으로 함수를 호출하십시오.

self.parse_file()

또한 다음과 같이 parse_file () 함수를 정의해야합니다.

def parse_file(self):

parse_file방법은 (는 정적 방법 아니기 때문에)를 호출시 객체에 바인딩해야합니다. 이것은 객체의 인스턴스에서 함수를 호출하여 수행됩니다 (귀하의 경우 인스턴스는 self입니다).


예! 이것은 내가 찾던 것입니다. 감사합니다!
PythonJin

33

내가 틀리지 않으면 두 함수가 모두 클래스의 일부이므로 다음과 같이 사용해야합니다.

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

라인 교체 :

parse_file() 

와:

self.parse_file()

왜 사용 self.parse_file()하지 말아야 하는지 설명해 주 parse_file()시겠습니까?
ivanleoncz

@paritoshsingh는 부분적으로 초기화 된 객체가 없도록 함수 def parse_file(self):아래에 중첩 되어서는 안 __init__됩니까?
donrondadon

@ivanleoncz parse_file은 인스턴스 메소드이므로 참조 객체를 사용하여 동일하게 호출해야합니다.
Paritosh Singh

@rong이 코드가 훌륭하고 외부에서 구문 분석 파일을 설정하지 못하게하려면 중첩되어야합니다.
Paritosh Singh

12

어때요?

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

당신이라는 이름의 변수가 있다면 그건 그렇고, stat1, stat2, 등, 상황은 튜플을 구걸된다 stats = (...).

따라서 parse_file튜플을 반환하고 튜플을에 저장하십시오 self.stats.

그런 다음, 예를 들어, 호출 할 무엇을 사용했는지에 액세스 할 수 있습니다 stat3self.stats[2].


나는 단지 self.stat1을 self.stat5에 넣어서 할당하고있는 클래스 변수가 있음을 보여줍니다. 실제 코드에는 더 우아한 솔루션이 있습니다.
PythonJin

parse_file함수가 MyClass객체 의 메소드가 되기를 원한다면 어떻게 변경해야합니까 ? self필요한 곳은 어디 입니까?
n1k31t4


0

다음과 같이 parse_file을 선언해야합니다. def parse_file(self). "self"매개 변수는 대부분의 언어에서 숨겨진 매개 변수이지만 파이썬에는 없습니다. 클래스에 속하는 모든 메소드의 정의에 추가해야합니다. 그런 다음 클래스 내부의 모든 메소드에서 함수를 호출하여self.parse_file

최종 프로그램은 다음과 같습니다.

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

-13

문제가 실제로 init 함수를 올바르게 들여 쓰기하지 않은 것 같습니다.

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

     def parse_file():
          pass

코드도 아닙니다. 당신은 넣어하지 않는 한 @staticmethod위에 장식을 parse_file
rantanplan

적어도 메소드에 누락 self을 추가하십시오 parse_file.
rantanplan

죄송합니다. "class MyClass () :"줄 아래에 추가 들여 쓰기 층이 있어야합니다. 위의 문제를 해결했지만 질문은 동일합니다.
PythonJin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.