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


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.