Разделение модуля с 8+ классами в пакет с каждым классом в своем собственном файле - PullRequest
1 голос
/ 01 августа 2010

У меня есть модуль (tools.py), содержащий много классов. Я хотел бы извлечь их в свой собственный пакет "Whyteboard.tools", каждый класс находится в своем собственном файле.

Однако ранее я перешел от того, чтобы все мои классы находились в одном базовом каталоге, к пакету ниже корня моего проекта, и у меня возникли проблемы с загрузкой в ​​маринованные файлы, сохраненные в старом формате. (см .: https://stackoverflow.com/questions/2121874). При загрузке файла я должен был обезопасить исправление dict sys.modules, а затем удалить его. nasty ...

Какой лучший способ сделать это?

Лучше ли также импортировать каждый из моих классов в пакете __init__, иначе мне придется

from whyteboard.tools.pen import Pen 

вместо

from whyteboard.tools import Pen

Ответы [ 2 ]

2 голосов
/ 01 августа 2010

Я обычно видел, как init .py в модулях делает что-то вроде:

from whyteboard.tools.pen import *

Таким образом, вы всегда можете импортировать из Whyteboard.tools и ссылаться на любой из классов внутриэтот модуль, не зная, где они находятся.Вам просто нужно просто знать о классах, предоставляемых пакетом whyteboard.tools.

1 голос
/ 01 августа 2010

Какой лучший способ сделать этот ход?

Сначала.Не.Класс на файл ничего не улучшит, так зачем?

были проблемы с загрузкой в ​​маринованные файлы, которые были сохранены в старом формате

Исправить.У вас должны возникли проблемы с загрузкой файлов, выбранных в старом формате, поскольку имена классов изменились.

Зачем менять их, если это вызывает проблемы?

Если вам абсолютно необходимо их изменить, вы можете попробовать что-то вроде этого для преобразования.Сохраняет исправления обезьян.Переход к вашей новой архитектуре.

import this.that.module 
import pickle
import os
legacy_obj= pickle.load( someFile )
os.rename( someFile, someFile+".bak")

import this.that.module.class
new_obj= this.that.module.class( legacy_obj )
pickle.save( someFile )

Существует среднее положение между 1900 строками в одном файле и 8+ файлами по 200+ строками в каждой.Один класс из 200+ строк означает, что у вас могут быть другие проблемы с дизайном.Возможно, вы захотите заняться этим, прежде чем создавать 8 файлов «по 1 классу каждый».

Учтите, что класс из 200 строк уже может делать слишком много.Возможно, вы захотите разложить свои классы, чтобы иметь более тонкие обязанности.Сделав это, вы можете обнаружить, что у вас есть несколько модулей - каждый с несколькими классами.

Возможно, вы захотите разложить коллекции связанных классов на повторно используемые модули.Упрощенный подход «класс-на-файл» может быть плохим способом реструктуризации.

...