2012-11-04 35 views
1

我有一个使用MVC模式的项目。Python在单独文件中管理类

在“模型”文件夹中,我有很多类,每个类现在都有它自己的文件。但我觉得这样不方便,因为每次我需要使用课程时,我都必须单独导入它。例如。我有很多的以下的在我的应用程序源:

from models.classX import classX 
from models.classY import classY 

如果我想一次导入的一切,像from models import *我发现,我可以把各种importmodels/__init__.py。但是这是做Python的pythonic方式吗?什么是约定?

+0

请使用PEP8外壳,以便您可以区分类和模块! - 'from models.classx import ClassX' – Eric

回答

0

大多数pythonic方式是你已经使用。您可以通过将模块中的类分组来缓解导入。例如,在Django中,通常所有的应用程序模型都在一个文件中。

蟒蛇docs

虽然某些模块的设计出口,只有当你使用import *遵循某种模式的名称,它仍然被认为在生产代码不好的做法。

6

Python不是java;请避免每类文件一个文件。如果你不能改变它,你可以导入所有的人都从你models包的子模块:

# all.py: convenient import of all the needed classes 
from models.classX import classX 
from models.classY import classY 
... 

然后在你的代码,你可以写:

import my.package.models.all as models # or from my.package.models.all import * 

,并继续使用models.classXmodels.classY

+3

你可以在'models/__ init __。py'中做同样的事情,然后你只需要'import my.package.models'。 – glglgl

+2

@glglgl然后你失去了单独导入'class ...'模块的能力 - 从包中导入任何东西都会加载整个包。如果这种紧密耦合是可取的(或者已经存在),那么将它们导入'__init __。py'就是要走的路。但人们希望拥有这么多模块的全部*点能够分别导入它们。 – user4815162342

+0

mmm ...你说得对。这是其中的缺点... – glglgl

0

首先,你应该重命名类和模块,使它们不匹配,并遵循PEP8:

models/ 
    classx.py 
     class ClassX 
    classy.py 
     class ClassY 

然后,我会用这让在models/__init__.py

from models.classx import ClassX 
from models.classy import ClassY 

意义在你的主代码中,你可以做的任何一个:

from models import * 
x = ClassX() 
from models import ClassX 
x = ClassX() 
import models 
x = models.ClassX() 
相关问题