2012-03-12 5 views
6

나는 파이썬에서 다음을 수행하는 프로그램을 가지고있다 :파이썬의 자세한 __init__ 메소드가 잘못 되었습니까?

사용자는 폴더의 이름을 입력한다. 그 폴더 안에 다른 확장자를 가진 8-15 개의 .dat 파일.

프로그램은 이러한 dat 파일을 열고 SQL 데이터베이스에 입력 한 다음 사용자가 데이터베이스에 대한 다른 변경 사항을 선택할 수 있도록합니다. 그런 다음 데이터베이스가 .dat 파일로 다시 내보내집니다. 수행 할 수있는 약 5-10 가지의 조작이 있습니다.

내가 설계 할 때 계획 한 방식은 파일 그룹마다 표준 클래스를 만드는 것이 었습니다. 사용자는 폴더의 이름과 특정 속성 (파일 이름, 파일 사전, 파일 버전 (다른 버전) 등)이있는 객체를 작성하게됩니다. 이러한 특성을 결정하려면 이러한 파일 중 일부를 열고 파일 이름을 읽어야합니다.

__init__ 방법으로이 작업을 수행해야합니까? 또는이 작업을 __init__ 메서드에서 호출되는 다른 인스턴스 메서드에서 수행해야합니까? 또는이 메소드가 다른 곳에 있어야하며 속성이 프로그램의 다른 곳에서 필요할 때만 호출해야합니까?

나는 이미 자바로이 프로그램을 작성했다. 클래스의 다른 메서드를 호출하여 객체의 속성을 설정하는 생성자가 있습니다. 그러나 나는 파이썬에서 표준적인 실천이 무엇인지 궁금해했다.

답변

1

의 동작은으로 초기화되어 있으므로 __init__에 입력하는 것이 좋습니다. 다른 한편으로는, 이러한 행동은 꽤 비싸고 아마도 프로그램의 다른 부분에서 유용 할 것입니다. 그래서 여러분은 그것들을 어떤 분리 된 함수로 캡슐화하고 싶을 것입니다.

1

__init__ 메서드는 개체가 인스턴스화 될 때 호출됩니다.

저는 C++ 배경에서 와서는 생성자에서 초기화 이외의 실제 작업을 수행하지 않는 것이 좋다고 생각합니다.

1

__init__ 방법을 사용하는 데는 문제가 없지만 단순히 테스트하기가 어렵 기 때문에이 방법을 사용하지 마십시오. 내 접근 방식은 __init__에서 호출되는 작은 메서드를 만드는 것입니다. 이 방법을 사용하면 개별적으로 초기화를 테스트 할 수 있습니다.

필요할 때 호출해야하는지 아니면 앞면으로 실행해야하는지는 실제로 필요한 작업에 따라 달라집니다. 비용이 많이 드는 작업이고 일반적으로 모두 필요하지 않은 경우 필요한 경우에만 호출하는 것이 좋습니다. 반면에 속성이 필요할 때 지연이 발생하지 않도록 앞에 실행해야 할 수 있습니다.

실제로 수업이 필요한지 여부는 질문에서 분명하지 않습니다. 자바에 대한 경험이 없지만 그 안에있는 모든 것이 클래스라는 것을 이해합니다. 파이썬에서는 필요한 경우에만 함수를 사용하고 인스턴스와 기타 고급 기능이 필요할 때만 클래스를 만드는 것이 허용됩니다.

+0

본질적으로 나는 "직업"으로 분류 될 수있는 파일 그룹을 가지고 있습니다. 다른 기능은이 작업에 대해 다른 작업을 수행하여 프로그램의 원하는 결과를 생성합니다. 그래서 나는 그것을 수업으로 가장 잘 유지한다고 생각한 이유입니다. –

+0

그리고이 것 같아 당신이 제안하는 것입니다 : __init의 __ (자기, 폴더 이름) : self.filelist = getfilelist (...); self.fileversion = getfileversion (...); 등? 메소드 중 하나가 비싸고 특정 인스턴스에서만 필요하다는 점을 제외하면? –

+0

이것이 코드에서 수행중인 것이라면 대신 [지연 속성] (http://stackoverflow.com/q/3012421/1235039)을 사용해야합니다. 이를 수행하는 방법은 여러 가지가 있습니다. 요구 사항과 선호도에 따라 다릅니다. – aquavitae

3

글쎄, 파이썬에서 좋은 OOP 관행에 특별한 것은 없다. 하나의 큰 메소드를 여러 개의 작은 메소드로 분해하면 Java와 Python에서 모두 훌륭한 아이디어가됩니다., 나는 그것이 자바에 있지만 파이썬에서 당신은 그들이 때문에 생성자에서 예외에 대해 걱정할 필요가 없습니다 방법을 모르는 게다가

class GroupDescriptor(object): 
    def __init__(self, file_dictionary): 
     self.file_dict = file_dictionary 
     self.load_something(self.file_dict['file_with_some_info']) 

    @classmethod 
    def from_filelist(cls, list_of_files): 
     file_dict = cls.get_file_dict(list_of_files) 
     return cls(file_dict) 

    @classmethod 
    def from_dirpath(cls, directory_path): 
     files = self.list_dir(directory_path) 
     return cls.from_filelist(files) 

: 무엇보다도 작은 방법은 당신에게 다른 생성자를 쓸 수있는 기회를 제공합니다 정교하게 다루었 다. 따라서 파일과 같은 예외가 발생하기 쉬운 작업을하는 것은 전적으로 정상입니다.

+0

+1 지금까지 답변하셨습니다. ;-) 나는 "다형성"생성자/초기화자를 사용하여 분해가 마음에 들지 않는 것을 좋아한다. 비록 당신이 그것을 정교하지 않았기 때문에 약간 거칠기조차하더라도 움직인다. –

관련 문제