如何合理组织Python类定义及其辅助文件?
这个问题可能之前有人问过,但我找不到针对我具体问题的答案(其实问题挺普遍的……)
让我给你举个例子。假设我的包叫做'school',里面有一个叫'book'的类,旁边会有一些.py文件,里面包含这个类的方法。我不太确定怎么组织这些文件,这样导入的时候看起来才不会奇怪。
我该怎么组织这些文件呢?
/school/
pencil/
book/
__init__.py
read.py
burn.py
book.py
我希望能像这样做,因为这样最合理:
from school import Book
b = Book(name="The Bible")
b.read()
但是从上面的文件结构来看,我必须这样做:
from school.book import Book
b = Book(....etc
或者
from school import book
b = book.Book(...etc
这样看起来很别扭/重复……我到底漏掉了什么呢?
1 个回答
7
我觉得你把包和类搞混了。个人来说,我会把每个类的定义和所有与这个类直接相关的函数放在同一个.py文件里。比如,阅读并不是一个对象,所以我会把它作为一个函数放在书籍类下面,而不是单独放在一个.py文件里。这样结构看起来会像这样。
/school/
pencil.py
book.py
在book.py文件里,你会看到这样的内容
class Book():
def __init__(self,name,author,isbn,your_variable_here):
#Your init method
def read(self,kid):
return "{0} is reading {1}.".format(kid,self.name)
def burn(self,library,lighter):
library.remove(self)
lighter.light(self)
return "Preparing to burn people."
然后,你的导入看起来会是这样。
from school import book
b = book.Book("The Art of War","Sun Tzu",'999342052X','Books rock!')
b.read(ike) #This assumes ike is an object, probably of the class Student, defined and imported from elsewhere
b.burn(library,lighter) #Once more, I'm assuming these are objects for which you've imported the definition and defined them earlier.
这个系统的好处是,它更贴近现实。与其把一堆函数放在文件结构里(正如你提到的,这样可能会变得复杂),不如把它们按类分组,形成逻辑上的组合和结构。不过,我认为学生类应该有阅读函数,图书馆类应该有借阅函数,而书籍类只应该有烧毁函数。因为书籍是不能阅读的,阅读的是人;书籍也不能借出,借出的是图书馆。这是一个关于你想如何组织代码的问题。