2010-10-01 19 views
53

我喜欢每个文件都有一个公共类的Java约定,即使有时候有很好的理由将多个公共类放入单个文件中也是如此。在我的情况下,我有相同接口的替代实现。但是,如果我想将它们放入单独的文件,我不得不在进口语句中多余的名称(或误导性的模块名称):在模块和/或包中组织Python类

import someConverter.SomeConverter 

someConverter将是文件(模块)的名称和SomeConverter类名。这对我来说很不雅观。把所有的替代类到一个文件将导致一个更有意义的import语句:

import converters.SomeConverter 

但我担心的是,文件变得相当大,如果我把所有相关的类到单个模块文件。这里的Python最佳实践是什么?每个文件有一个类是不寻常的?

+7

通过你在处理由10000类的项目的时候,你会很高兴,如果你可以通过其文件(包)名称查找(公共)类,而不是必须搜索a的内容这可能是Java为什么强制每个文件只有一个公共类,并且文件名必须是类名的原因。 – 2010-10-01 20:10:49

回答

55

很多都是个人喜好。使用Python模块,你必须保持每个类在一个单独的文件选项,仍然允许import converters.SomeConverter(或from converters import SomeConverter

你的文件结构可能是这个样子:

* converters 
    - __init__.py 
    - baseconverter.py 
    - someconverter.py 
    - otherconverter.py 

,然后在__init__.py文件:

from baseconverter import BaseConverter 
from otherconverter import OtherConverter 
36

扎克对Python 3的解决方案突破这里是一个固定的解决方案。

很多都是个人喜好。使用Python模块,你必须保持每个类在一个单独的文件选项,仍然允许import converters.SomeConverter(或from converters import SomeConverter

你的文件结构可能是这个样子:

* converters 
    - __init__.py 
    - baseconverter.py 
    - someconverter.py 
    - otherconverter.py 

,然后在__init__.py文件:

from converters.baseconverter import BaseConverter 
from converters.otherconverter import OtherConverter 
+1

刚刚“从.baseconverter导入BaseConverter”如何? – 2014-02-01 15:09:09

+0

对不起后续跟进,我最近与python脱节,如果有人可以验证上面的Michael的解决方案,请随时编辑我的答案,并添加替代方案。 (不要改变我的原创,因为我认为这是一个偏好哪个看起来更具可读性的问题,所以让我们给用户两个选项) – Spundun 2014-03-10 16:29:02

+6

Michael的答案确实有效,但PEP 8不鼓励相关的进口。 http://stackoverflow.com/questions/4209641/absolute-vs-explicit-relative-import-of-python-module – 2014-04-26 13:34:29