У меня есть пакет с тремя модулями (см. Шаблонный модуль ниже):
|____mypackage
| |______init__.py
| |____serial.py
| |____modbus.py
| |____base.py
base
имеет абстрактный класс BaseClient
, который обеспечивает высокоуровневую логику приложения, посредством которой пользователи взаимодействуют сбазовые реализации клиента.
serial
и modbus
каждая имеет класс, который обеспечивает высокоуровневую сетевую логику, которую я в настоящее время называю BaseSerial
и BaseModbus
.Эти модули также имеют несколько классов, которые являются конкретными реализациями BaseClient
и также наследуются от их соответствующих BaseSerial
/ BaseModbus
классов.
Мой вопрос: существуют ли какие-либо стандартные / предпочтительные соглашения об именахдля классов типа BaseSerial
/ BaseModbus
? (мне кажется, что дать им одно и то же имя, например, BaseNetworking
, было бы чище и интуитивно понятнее, но я также мог видеть, как это может вызвать проблемы).)
Или, возможно, более уместные вопросы:
- Является ли эта структура пакета даже хорошей практикой?
- Должны ли все эти классы быть в одном модуле, таким образом,мой вопрос н / д?
- Есть ли смысл разделять абстрактные классы на отдельные модули от разных типов конкретных реализаций, или это слишком фрагментированный дизайн?
Я прочитал Соглашения об именах PEP-8 и не смогли найти ничего, связанного с именованными классами с пространством имен и / или с тем, чтобы учитывать имена схожих классов в разных пространствах имен.Кроме того, я не смог найти комментарий о том, как лучше отделить (или не отделить) абстракции от конкретных реализаций.
Ниже приведены стандартные реализации описываемого мной пакета:
base
шаблон:
class BaseClient:
def doAppLogic(self):
....
def read(self):
raise NotImplementedError
def connect(self):
raise NotImplementedError
serial
шаблон:
import base
class BaseSerial:
def connect(self):
...
class SerialSubclass1(BaseSerial, base.BaseClient):
def read(self):
if self.connect():
...
modbus
шаблон:
import base
class BaseModbus:
def connect(self):
...
class MobusSubclass1(BaseModbus, base.BaseClient):
def read(self):
if self.connect():
...
В настоящее время то, что у меня отлично работает.Но я тратил время на рефакторинг своего проекта, чтобы как можно точнее соответствовать руководствам PEP, и я столкнулся с препятствием на пути решения этой проблемы метадизайна.Я хочу, чтобы этот проект был как нельзя лучше.