하나의 파일에 몇 개의 클래스를 넣어야합니까? [닫은]


274

파일 당 하나의 공개 클래스를 가질 수있는 Java 모델에 익숙합니다. 파이썬에는 이러한 제한이 없으며 클래스를 구성하는 가장 좋은 방법이 무엇인지 궁금합니다.


8
나는 이것이 다른 언어의 요구 사항과 규칙을 고려할 때 합리적인 질문 이라고 생각 하며 그 대답 은 "<파이썬 모듈 및 패키지 정의>와 그 너머 선호도 (/ 의견)"의 문제입니다- 그 대답 자체는 의견이 아닙니다
— david.libremone

답변:


333

파이썬 파일을 "모듈"이라고하며 소프트웨어가 "감지"가되도록 구성하는 한 가지 방법입니다. 다른 하나는 "패키지"라고하는 디렉토리입니다.

모듈은 하나 또는 두 개의 밀접하게 관련된 클래스를 가질 수있는 별개의 것입니다. 요령은 모듈을 가져 오는 것이므로 소프트웨어를 읽고 유지 관리하고 확장하는 사람들에게 가져 오기를 완벽하게 이해하는 것이 필요합니다.

규칙은 이것입니다 : 모듈은 재사용 단위입니다 .

단일 클래스를 쉽게 재사용 할 수 없습니다. 어려움없이 모듈을 재사용 할 수 있어야합니다. 라이브러리의 모든 것 (및 다운로드 및 추가 한 것)은 모듈 또는 모듈 패키지입니다.

예를 들어 스프레드 시트를 읽고 계산을 수행하고 결과를 데이터베이스에로드하는 작업을하고 있습니다. 메인 프로그램의 모양은 무엇입니까?

from ssReader import Reader
from theCalcs import ACalc, AnotherCalc
from theDB import Loader

def main( sourceFileName ):
    rdr= Reader( sourceFileName )
    c1= ACalc( options )
    c2= AnotherCalc( options )
    ldr= Loader( parameters )
    for myObj in rdr.readAll():
        c1.thisOp( myObj )
        c2.thatOp( myObj )
        ldr.laod( myObj )

가져 오기를 개념 또는 청크로 코드를 구성하는 방법으로 생각하십시오. 각 가져 오기에 정확히 몇 개의 클래스가 있는지는 중요하지 않습니다. 중요한 것은 import진술 과 함께 묘사하는 전체 조직입니다 .


24
하하, 나는 인용에서 "감각"을 좋아한다.
— cdleary

27
@cdleary : 한 사람의 감각은 다른 사람의 광기입니다. 일반적으로 합리적인 모듈을 정의 할 수 있습니다. 그러나 큰 응용 프로그램에는 항상 여러 차원의 분석이 있으며 한 사람이 다른 사람의 기능 분할 및 절단에 머리카락을 나눕니다.
— S.Lott


4
실제로 질문에 대답하지 않는 대답, 가독성은 어떻습니까? 500 줄 이상의 파일을 읽기가 어렵습니다.
— Vedmant

38

인위적인 한계가 없기 때문에 실제로 이해할 수있는 것에 달려 있습니다. 논리적으로 함께 그룹화되는 상당히 짧고 간단한 클래스가 여러 개 있다면 무리로 던집니다. 그룹으로 이해하기 어려운 크고 복잡한 수업이나 수업이있는 경우 수업 당 하나의 파일로 이동하십시오. 또는 사이에 무언가를 선택하십시오. 상황이 변함에 따라 리팩터링하십시오.


23

다음과 같은 이유로 Java 모델을 좋아합니다. 각 클래스를 개별 파일에 배치하면 소스 코드를 탐색 할 때 클래스를보다 쉽게 ​​볼 수있어 재사용이 촉진됩니다. 하나의 파일로 그룹화 된 클래스가 많은 경우 다른 디렉토리 에는 프로젝트의 디렉토리 구조를 탐색하여 재사용 할 수있는 클래스가 있음이 분명하지 않을 수 있습니다 . 따라서 클래스를 재사용 할 수 있다고 생각하면 자체 파일에 넣을 것입니다.


2
전적으로 동의합니다. 하나의 파일에 여러 개의 공개 클래스를 갖는 것은 직관적이지 않으며 누군가가 구조를 숨기고 싶어하고 칙칙한 느낌이 드는 것처럼 코드를 이해하기 어렵게 만듭니다. 특히 Java에서 Python으로 온 경우.
— WebComer

특히 Java에서 Python으로 온 경우. 그들은 파이썬에서 하나의 파일로 많은 클래스를
— 던지곤했습니다

14

그것은 전적으로 프로젝트의 크기, 클래스의 길이, 다른 파일에서 사용될 것인지 등에 달려 있습니다.

예를 들어 데이터 추출을 위해 일련의 클래스를 사용하는 경우가 많으므로 한 줄 길이 ( class SomeData: pass) 일 수있는 4 개 또는 5 개의 클래스가있을 수 있습니다 .

각 파일을 별도의 파일로 나누는 것은 어리석은 일이지만 다른 파일에서 사용될 수 있으므로 모든 data_model.py파일을 별도의 파일 에 넣으면 의미가 있습니다.from mypackage.data_model import SomeData, SomeSubData

코드가 많은 클래스가 있거나 일부 함수 만 사용하는 클래스가있는 경우이 클래스와 도우미 함수를 별도의 파일로 분할하는 것이 좋습니다.

당신이 할 수 있도록 당신이 그들을 구조해야 from mypackage.database.schema import MyModel하지 from mypackage.email.errors import MyDatabaseModel당신이 만드는 감각에서 물건을 가져 오는 경우 경우 및 파일이 긴, 당신은 제대로 정리하지 수만 줄입니다 -.

파이썬 모듈 설명서 패키지를 조직에 대한 몇 가지 유용한 정보가 있습니다.


1
파이썬 모듈 문서에 대한 링크가 끊어졌습니다. 어쩌면 섹션 6.4 모듈. 패키지 는 이제 의도 된 링크입니까?
— cod3monk3y 2019

9

파일이 너무 커서 짜증이 나고 관계의 바람직한 구조가 자연스럽게 나타나기 시작하면 나 자신을 분리시킵니다. 이 두 단계는 종종 일치하는 것 같습니다.

완전히 다른 구조의 순서가 필요하다는 것을 깨닫기 시작하기 때문에 물건을 너무 일찍 나누면 매우 성 가실 수 있습니다.

반면에 .java 또는 .py 파일이 약 700 줄 이상에 도달하면 "특정 비트"가 어디에 있는지 기억하려고 끊임없이 화가 나기 시작합니다.

파이썬 / 자이 썬을 사용하면 import 문에 대한 순환 의존성도 중요한 역할을합니다. 너무 많은 협력하는 기본 빌딩 블록을 별도의 파일로 분할하려고하면 언어의이 "제한"/ "불완전"으로 인해 그룹화해야 할 것 같습니다. 오히려 합리적인 방법으로.

패키지로 나눌 때, 나는 정말로 모른다. 그러나 아마도 같은 성가심 규칙과 행복한 구조의 출현이 모든 수준의 모듈성에서 작동한다고 말할 것이다.


6

파일을 너무 크고 복잡하게 만들지 않고 해당 파일에 논리적으로 그룹화 할 수있는만큼 많은 클래스를 배치하고 싶습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.