1
Livid MOD 我目前的做法是用一个 package。
比如类似这样的结构: v2ex/babel/data/models/__init__.py 用的时候: from v2ex.babel.data.models import * |
3
Livid MOD @killall 如果真到了那样的阶段,那么就在 models 下再拆包好了。比如:
from v2ex.babel.data.models.topic import * from v2ex.babel.data.models.member import * ... |
4
reorx 2011-04-07 13:04:02 +08:00
可以尝试吧数据库操作的方法直接写在相应的类里面,然后想调用哪个类的数据就直接import进来,执行相关方法。
比如(我用的是Django,不过应该大同小异): class Book(Model): author = ForeignKey(Author) title = CharField(max_length=50) .... @classmethod def get_by_aid(cls, aid): # aid means author_id try: d = cls.objects.filter(author__id=aid) except: d = None return d 用的时候直接from models import Book;books = Book.get_by_aid(aid);就可以了。 |
5
Livid MOD |
6
vayn 2011-04-07 13:21:24 +08:00
@Livid 我在 SudoRobot 里用了 @classmethod 这个装饰符,虽然忘记了是什么时候引入的但至少在 Python 2.5 可以用。
|
7
qichangxing 2011-04-07 13:47:17 +08:00
from models.test1 import *
这种做法容易造成名字污染,比如不同 model 下面有相同的对象时就不易排查错误。 采用下面的做法更清晰: from models import test1 使用时 test1.a,test1.b 等 |
8
qichangxing 2011-04-07 13:49:46 +08:00
另外,对多东西太多,可以按目录(包)来组织,比如:
models/ models/__init__.py # 空文件,必须,表示当前是一个可引用的包 models/people.py models/product.py models/category.py |
9
killall OP @reorx 如果这样组织可以不用classmethod的修饰符就可以完成
@qichangxing 嗯,目前是按照这样的方式组织,但是我想做的是 只要一句from..import 就可以使用所有的MODEL,所以现在看来用@livid的这种组织方式在实际应用中是否可行 |
10
reorx 2011-04-07 14:37:31 +08:00
|
11
vayn 2011-04-07 14:43:38 +08:00
|
12
reorx 2011-04-07 14:43:53 +08:00
@qichangxing 之前我也是这样用的,后来由于导入过于复杂的缘故而全部重构了(因为如果在product.py里又要用到people.py岂不是会还要import一次?这样会造成一个包下面的几个文件不断互相导入……)。我曾请教一个朋友,他说这样有违python的思想,变得有些像java了。他还说其实即便将一个.py文件写个上千行,如果安排得当,也是很容易维护和修改的。
|
13
qichangxing 2011-04-07 15:41:55 +08:00
“…… 一个.py文件写个上千行,如果安排得当,也是很容易维护和修改的。”
如果你是新手,慎重这种做法。 在 python 里倡导简单、清晰。 |