2010-08-16 7 views
11

모듈과 클래스를 함께 구성하는 방법을 알아 내려고 노력하고 있습니다. C++에서부터, 나는 그 데이터를 처리하는 데 필요한 모든 데이터와 메소드를 캡슐화하는 클래스에 익숙하다. 파이썬에는 모듈이 있지만 코드에서는 내가 보았습니다. 어떤 사람들은 많은 사람들이 느슨한 모듈에 저장되어있는 반면 다른 모듈은 함수로 클래스를 메서드로 바인딩합니다.파이썬에서 클래스와 모듈 구성하기

예를 들어 데이터 구조가있어 디스크에 쓰기를 원한다고 가정 해보십시오.

한 가지 방법은 그냥 그런

MyObject.save(filename) 

또는 뭔가를 입력 할 수 있도록 그 개체의 저장 방법을 구현하는 것입니다. 나는 동일한 비율로 본 또 다른 방법은이 작은 예입니다, 나는이 문제가 전혀 얼마나 파이썬 특정 모르겠지만, 내 일반적인 질문은 최고입니다 무엇

from myutils import readwrite 

readwrite.save(MyObject,filename) 

뭔가를하는 것입니다 함수의 측면에서 파이썬의 실천 대 메소드 조직?

답변

13

느슨한 기능이 너를 괴롭히는 것처럼 보입니다. 이것은 파이썬 방법입니다. 파이썬의 모듈은 실제로 다른 객체와 같은 기초에있는 객체이기 때문에 의미가 있습니다. 파일에서 파일을로드 할 때 언어 수준의 지원을 제공하지만 그 외에는 단지 객체입니다.

내가 모듈 foo.py이 그렇다면 :

import pprint 

def show(obj): 
    pprint(obj) 

그런 다음 나는 bar.py

import foo 

class fubar(object): 
    #code 

    def method(self, obj): 
     #more stuff 
     foo.show(obj) 

내가 본질적으로 foo 객체의 메소드에 접근하고에서 가져올 때. foo 모듈의 데이터 특성은 foo에 정의 된 전역입니다. 모듈은 모든 메소드 인수 목록 앞에 self을 추가 할 필요없이 싱글 톤의 언어 수준 구현입니다.

최대한 많은 모듈 수준 기능을 작성하려고합니다. 일부 함수가 특정 클래스의 인스턴스에서만 작동하는 경우 클래스의 메서드로 만듭니다. 그렇지 않으면, 내가 이해할 수있는 모듈에 정의 된 모든 클래스의 인스턴스에서 작동하도록 노력한다.

당신이 준 올바른 예제의 합리적인 이유는 각 클래스에 save 메소드가있는 경우, 나중에 데이터를 저장하는 방법을 변경하면 (파일 시스템에서 데이터베이스 또는 원격 XML 파일로) 데이터를 변경할 때마다 수업. 각 클래스가 저장할 데이터를 생성하는 인터페이스를 구현하면 모든 클래스의 인스턴스를 저장하고 해당 함수를 한 번만 변경하는 함수를 작성할 수 있습니다. 이를 단일 책임 원칙 (Single Responsibility Principle)이라고합니다. 각 클래스에는 변경할 수있는 유일한 이유가 있어야합니다.

3

디스크에 저장하려는 일반 구식 클래스가있는 경우 인스턴스 메서드로 변경하면됩니다. 다른 유형의 객체를 처리 할 수있는 직렬화 라이브러리라면 두 번째 방법을 사용합니다.

+2

"class method"라는 용어는 classmethod처럼 들리지만 적용 할 수 없습니다. 적절한 것은 "메소드"또는 "인스턴스 메소드"라고합니다. –

+0

예, 당신 말이 맞아요. 나는 인스턴스 메서드를 의미합니다. –