동일한 파일에 여러 클래스를 정의하는 것이 Pythonic으로 간주됩니까?


31

파이썬으로 처음 작업 할 때, 같은 파일에 여러 클래스를 작성하게되는데, 이는 클래스 당 하나의 파일을 사용하는 Java와 같은 다른 언어와는 반대입니다.

일반적으로 이러한 클래스는 1 개의 추상 기본 클래스로 구성되며, 사용하는 1-2 개의 구체적인 구현은 약간 다릅니다. 아래에 그러한 파일을 게시했습니다.

class Logger(object):

    def __init__(self, path, fileName):
        self.logFile = open(path + '/' + filename, 'w+')
        self.logFile.seek(0, 2)

    def log(self, stringtoLog):
        self.logFile.write(stringToLog)

    def __del__(self):
        self.logFile.close()

class TestLogger(Logger):   

    def __init__(self, serialNumber):
        Logger.__init__('/tests/ModuleName', serialNumber):

    def readStatusLine(self):
        self.logFile.seek(0,0)
        statusLine = self.logFile.readLine()
        self.logFile.seek(0,2)
        return StatusLine

    def modifyStatusLine(self, newStatusLine):
        self.logFile.seek(0,0)
        self.logFile.write(newStatusLine)
        self.logFile.seek(0,2)

class GenericLogger(Logger):

    def __init__(self, fileName):
        Logger.__init__('/tests/GPIO', fileName):

    def logGPIOError(self, errorCode):
        self.logFile.write(str(errorCode))

위에서 보았 듯이 Logger 기본 클래스가 있는데 그 아래 몇 가지 구현 차이가 있습니다.

질문 : 파이썬이나 다른 언어에 대한 표준입니까? 이 구현을 사용하면 어떤 문제가 발생할 수 있습니까?

편집 : 나는이 특정 파일 에 대한 지침을 실제로 찾고 있지 않지만 더 일반적인 의미로 찾고 있습니다. 수업이 3-5 개의 중간 정도의 복잡한 방법으로 끝난다면? 그런 다음 분할하는 것이 합리적입니까? 파일을 분할해야한다는 컷오프는 어디에 있습니까?


3
파일 당 하나의 클래스로 제한하는 것은 C ++이 아닙니다. Java는 피해야 할 것으로 간주되는 곳을 아는 유일한 언어입니다. C ++에서는 단일 .h / .cpp 파일에 기본 클래스 하나와 기본 클래스에 대한 비공개 클래스가 아닌 많은 도우미 클래스가있는 것이 매우 일반적입니다.
로봇 고 르트

@StevenBurnap 당신이 올바른대로 예제로 c ++을 제거했습니다.
Ampt

1
자동 로딩을 용이하게하기 위해 PHP에서도 수행됩니다. 반면에 PHP에서는 네임 스페이스를 명시 적으로 선언 할 수 있습니다.
bodo

답변:


24

괜찮아. C ++에서도 괜찮습니다.

밀접하게 연결된 것을 유지하는 것이 현명한 관행입니다. 부적절한 커플 링을 피하는 것도 좋습니다. 올바른 균형을 잡는 것은 엄격한 규칙의 문제가 아니라 서로 다른 우려 사이의 균형을 유지하는 것입니다.

몇 가지 경험 법칙 :

  1. 크기

    지나치게 큰 파일은 추악 할 수 있지만 여기서는 거의 그렇지 않습니다. 당신이 무엇을 알아내는 데 도움이되지 않도록 추함은, 아마 좋은만큼 파일을 분할하는 이유하지만, 미적 감각이 크게 경험의 문제라고 개발 선험적

  2. 우려의 분리

    구체적인 구현에 내부 문제가 매우 다른 경우 단일 파일에 이러한 모든 문제가 누적됩니다. 예를 들어, 겹치지 않는 종속성으로 구현하면 단일 파일이 모든 종속성의 통합에 종속됩니다.

    따라서 하위 클래스의 종속성에 대한 커플 링이 인터페이스에 대한 커플 링보다 크다는 것을 고려하는 것이 합리적 일 수 있습니다 (또는 인터페이스 구현에 대한 관심은 해당 구현에 대한 관심 보다 약합니다).

    구체적인 예로 일반적인 데이터베이스 인터페이스를 사용하십시오. 메모리 내 DB, SQL RDBMS 및 웹 쿼리를 각각 사용하는 구체적인 구현은 인터페이스와 별도로 공통점이 없으며 경량 메모리 내 버전을 원하는 모든 사용자가 SQL 라이브러리를 가져 오도록하는 것은 불쾌합니다.

  3. 캡슐화

    캡슐화가 잘 된 클래스를 동일한 모듈로 작성할 있지만 모듈 외부로 내 보내지 않는 구현 세부 사항에 액세스 할 수 있기 때문에 불필요한 커플 링을 장려 할 있습니다.

    이것은 내가 생각하기에는 좋지 않은 스타일이지만 습관을 깰 수 없다면 모듈을 분할하여 더 나은 훈련을 시행 할 수 있습니다.


2
하나의 파일로 클래스를 결합하는 것이 정상임을 보여주는 외부 참조를 인용하거나 그것이 왜 좋은지에 대한 더 많은 설명을 제공함으로써 답이 더 강해질 것입니다.

1
나는 이것이 내가 의미하는 바의 예일 뿐이며 질문의 본질을 정확하게 나타내는 것은 아니라는 것을 지적하기 위해 질문을 편집했습니다. 필요한 곳에서 단순히 가져 오는 것보다 동일한 파일로 유지하는 것이 더 좋은 이유는 무엇입니까?
Ampt

작은 파일을 많이 갖는 것은 몇 개의 거대한 파일을 갖는 것만 큼 관리하기가 어려울 수 있습니다. 파이썬은 상당히 간결한 언어입니다. 귀하의 예는 이것을 보여줍니다. 이 세 클래스는 직접 관련이 있으며 스크롤하지 않고 단일 편집기 창에 적합합니다.
로봇 고 르트

1
@ GlenH7-참조가 확실하지 않습니다. 그들은 단지 주장을 직접하는 것에서 내 선택 편견이 유효하다고 주장하는 것으로 직접 이동하기 때문입니다. 대신 설명에 집중하려고했습니다.
쓸모없는

7

내 평소 참조 문서는 pythonic이 무엇인지 알고 있습니다.

단순한 것보다 복잡한 것이 좋습니다.

평평한 것이 중첩보다 낫습니다.

에서 파이썬의 선

거의 예외없이 클래스 이름은 CapWords 규칙을 사용합니다.

패키지 및 모듈 이름 모듈은 소문자로 된 짧은 이름이어야합니다. [...] 모듈 이름이 파일 이름에 매핑됩니다

에서 PEP 8

내 해석은 일을 단순하고 평평하게 유지하는 것이 좋다는 것입니다. 또한 클래스 이름과 파일 이름이 다른 경우가 있기 때문에 어쨌든 동일하지 않아야하므로 여러 관련 클래스를 파일로 묶는 데 아무런 문제가 없습니다.


7
질문과 관련된 부분으로 줄일 수 있습니까? 이 두 가지를 모두 읽었지만 현재 질문과 관련된 부분 을 선택하는 데 어려움을 겪고 있습니다.
Ampt

1
실제로, 나는 대답을 편집했다.
SylvainD

1

지금 가지고있는 것은 괜찮습니다. 하나의 파일에 여러 관련 클래스를 가진 많은 모듈이 있습니다. 언젠가는 상황이 커지고 결국에는 여러 개의 파일이있는 모듈을 사용하기를 원하지만 실제시기에 대한 규칙은 없습니다. 하나의 파일이 '너무 크다'고 느끼기 시작하면 상황이 나빠집니다.


0

확실히 괜찮습니다. 여러 클래스가 실현되는 한 파일에 여러 클래스를 두는 것이 좋습니다. 일반적으로 수업은 짧고 간결해야하며 거대 모 놀리 식 수업을 만드는 것보다 두 개 이상의 수업으로 행동을 분리해야합니다. 여러 개의 작은 클래스를 작성할 때 실제로 같은 파일과 관련된 클래스를 유지하는 것이 필요하고 도움이됩니다.


-1

한마디로-네.

또한 단일 파일에 여러 클래스를 갖는 것이 때로는 매우 편리합니다. 일부 패키지 ( six, bottle)는 pip를 설치하지 않고 타사 모듈에 쉽게 통합하기 위해 단일 파일로 명시 적으로 제공됩니다 (때로는 바람직 함). 그러나 코드를 잘 정리하십시오. 더 읽기 쉽게하기 위해 코드 주석과 분리 블록을 집중적으로 사용하십시오.


3
이것은 몇 년 전에 게시 된 이전 답변 에 비해 실질적인 내용을 추가하지 않는 것 같습니다
gnat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.