2011-11-09 3 views
5

파이썬으로 앱을 구조화하려고합니다. C#/Java 배경에서 돌아와서, 나는 파일 당 하나의 클래스 접근법을 좋아한다. 나는 다음과 같이 내 프로젝트 트리를 싶습니다모듈과 패키지 당 Python 하나의 클래스

[Service] 
    [Database] 
     DbClass1.py 
     DbClass2.py 
    [Model] 
     DbModel1.py 
     DbModel2.py 
    TheService.py 
[ServiceTests] 
    [Database] 
     DbClass1Tests.py 
     DbClass2Tests.py 
    [Model] 
     DbModel1Tests.py 
     DbModel2Tests.py 
    TheServiceTests.py 
  1. 파이썬에서 확인 파일 접근 당 하나 개의 클래스인가요?
  2. 인가 그것을 가능한 패키지 DbModel1Tests.py에서 즉, 자바의 패키지 또는 .NET의 네임 스페이스처럼 작동 할 수 있도록하는 방식으로 패키지/모듈을 만들 수 있습니다 : 당신은 하나 개의 클래스 당을 가질 수

    import Service.Model 
    
    def test(): 
        m = DbModel1() 
    
+9

[PEP 8 스타일 가이드 (Python 코드)] (http://www.python.org/dev/peps/pep-0008/)를보십시오. –

답변

4

내 의견으로는, 나는 왜 보이지 않습니다. 나는 언어에 관계없이 좋은 아이디어라고 생각합니다. 파일에 단 하나의 클래스 만 있다는 것을 알았을 때 파일에서 무엇을 발견 할 것인지에 대한 간단한 개요를 제공합니다. 하지만 헬퍼 클래스에 대해서는 작은 예외를 만들지 만, 파이썬에서는 중첩 클래스를 허용하므로이 작업 또한 매우 훌륭하게 수행 할 수 있습니다.

2 인 경우 : 가능합니다. 예를 들어, 모듈을로드하면 전체 네임 스페이스에서 클래스와 함수를 사용할 수 있습니다.

import Service.Model라고 말하면 m = Service.Model.DBModel1()을 사용하여 수업에 액세스 할 수 있습니다.

현재 네임 스페이스로 항목을 가져 오려면 from Service.Model import * (또는 해당 클래스 만 필요할 경우 from Service.Model import DBModel1)을 수행하십시오. 그러면 현재 할 수있는 것처럼 할 수 있습니다 : m = DBModel1().

+5

OP의 구조를 사용하면 약간의 오해의 소지가 있습니다.'Service.Model import DBModel1'에서'm = DBModel1.DBModel1()'을 쓰지 않아도됩니다. (클래스 이름이 .py의 것과 같다고 가정하십시오. 파일)? – jwd

3

모듈이지만 필수는 아닙니다. 각 모듈의 길이와 더 관련이 있다고 말할 수 있습니다. 너무 길지 않게 유지하는 것이 항상 좋은 아이디어입니다.

지금, 당신의 구조에 대해 :

  • 당신은 패키지로 하위 폴더를 선언 할 수 있습니다. 이를 위해서는 각 하위 폴더에 __init__.py 파일을 만드십시오. 이 작업이 완료되면
  • ,이 같은 모듈을 가져올 수 있습니다 from Service.Model import DbModel를하고로 사용 썼다 : m = DbModel1.DbModel1Class()

참고 : 대문자 정말 아니므로

  • 은 첫 글자와 파일 이름을 지정 Pythonic (하지만 클래스 이름이 있어야합니다). 즉, service.model.dbModel1.DbModel1()과 같아야합니다.
  • DbModel1 모듈에서 직접 클래스를 가져 오려면 from Service.Model import DbModel1을 수행 할 수 있습니다. __init__.py 콘텐츠를 올바르게 설정하여이 작업을 수행 할 수 있습니다 (정확히 구성하는 방법을 모르겠습니다). Some more informations here.
13

Q1. 파이썬에서는 파일 스타일 당 1 클래스를 사용할 수 있지만, 이는 드문 경우입니다.

2. from Service.Model import *을 사용하고 Service/Model/__init__.py에서 몇 가지 작업을 수행해야합니다.이 작업은 일반적으로 싫은 일입니다.피하 import * 파이썬에서

내 개인적인 조언 : 파이썬은 아니요 C#/Java입니다. $ other_language처럼 보이게하기 위해 그것을 구부리려고하면 좌절감과 사용자 경험이 떨어집니다. 당신이 필요하지 않는

  • 당신이 모듈에서 클래스를 가져올 필요가 없습니다 (예를 들어, 함수)

    • 파이썬 모듈의 클래스 이외의 물건을 가질 수 있습니다

      있음을 알아 두셔야합니다 그 클래스를 인스턴스화합니다. 특히 코드에서 함수/메서드에 인수로 전달 된 DbModel1 인스턴스 만 사용하는 경우 코드 부분에서 가져 오기를 수행 할 필요가 없습니다.

    • Service.Model.DbModel1 import DbModel1이 나쁨으로 보입니다. 선호 from service.model import DbModel1 : 파일 이름과 디렉토리 이름에 대문자를 사용하지 말고, 파일 시스템 당 1 클래스와 마찬가지로 논리적으로 파일에 그룹 분류/기능을 사용하지 마십시오.
  • +0

    파이썬에서 파일에 대해 하나의 클래스가 비정상적인 이유는 무엇입니까? – Gewthen

    +0

    @Gewthen은 언어에 의해 위임 된 것이 아니므로 일반적인 관행은 아닙니다. –

    +1

    동의 여부에 관계없이 "해야하고하지 말아야 할 일들"의 일부에 설명과 추론이있는 경우이 대답이 더 유용 할 수 있습니다. pep 8을 언급하면 ​​일부 점에 도움이되지만 다른 사람들은 더 많이 필요합니다 (예 : "일반적으로 눈살을 찌푸림", "나쁨"). – Gewthen

    관련 문제