Как распределить классы Python в разные исходные файлы, не создавая много модулей? - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть несколько связанных классов, находящихся в пакете, подобном этому:

\cool
  \__init__.py
    class CoolObj: ...
    class CoolStr(CoolObj): ...
    class CoolName(CoolStr): ...
    class CoolSound(CoolObj): ...

И я использую эти классы так:

import cool
cn = cool.CoolName()
...

Этот файл __init__.py тоже становитсядолго.Было бы хорошо, если бы я мог поместить каждый класс в каждый отдельный файл следующим образом:

\cool
    \__init__.py
    \cool_obj.py
        class CoolObj: ...
    \cool_str.py
        class CoolStr(CoolStr): ...
    \cool_name.py
        class CoolName(CoolStr): ...
    \cool_sound.py
        class CoolSound(CoolObj): ...

Однако, таким образом, эти файлы становятся modules , и мне придется использоватьих как ниже, что немного многословно.

from cool import cool_obj, cool_str, cool_name, cool_sound
cn = cool_name.CoolName()

Есть ли в любом случае исходный код, который можно поместить в отдельный файл, и при этом иметь возможность ссылаться на них с кратким синтаксисом, как сейчас?

Еще лучше, есть ли в python что-то вроде частичный класс в C#, позволяющее распространять реализацию одного и того же класса в разных файлах?

1 Ответ

0 голосов
/ 20 февраля 2019

В вашем __init__.py вы можете сделать импорт, чтобы сократить использование его в другом месте.Таким образом, строка в __init__.py может быть

from cool_name import CoolName

И позже вы можете сделать

from cool import CoolName

. Вы также можете посмотреть на __all__ какдругой способ решения этой проблемы.Вы можете импортировать все виды вещей в модуль cool.__init__.py, и если вы включите __all__, вы можете явно указать, какие объекты будут экспортироваться.

Что касается частичных классов, я почти уверен, что Python не делаетподдерживать этот вид функциональности через регулярные определения классов.Вы можете взломать его вместе, вводя различные функции в класс во время выполнения, но это, безусловно, будет грязно. Этот ответ более глубоко смотрит на этот путь.

...