Как расширить (наследовать) модуль в Python?
Поэтому я слышал, что модули очень питонны, и я много структурирую свой код, избегая классов.
Но сейчас я пишу модуль Formula
который имеет много той же функциональности, что и модуль Car
, Как мне справиться с этим?
- Дублировать код в обоих модулях?
- Преобразовать в классы?
- Рефакторинг кода для добавления третьего, родительского модуля
Vehicle
и импортировать методы и переменные, которые мне нужны?
Третий выглядит хорошо, единственный недостаток, который я вижу, это то, что есть некоторые переменные, которые являются специфическими для модуля (например, top_speed), но функции в родительском модуле Vehicle должны получить доступ к этим конкретным переменным.
4 ответа
Модуль является экземпляром, а не классом, поэтому вы не можете наследовать от него больше, чем можете наследовать от 6
,
Если у ваших вещей есть состояние, у вас должны быть классы, а не модули.
Если у вас есть два модуля, которые нуждаются в одинаковом материале, то это либо a) один из них должен иметь его, а второй должен использовать первый, либо b) они оба должны получить его из третьего модуля.
Имена модулей обычно в нижнем регистре, так как имена в верхнем регистре /CamelCase указывают классы.
Модули могут иногда использоваться для реализации Singletons, но они не предназначены для замены классов. Вы можете импортировать модуль только один раз, в то время как класс может иметь несколько экземпляров.
Если вам нужно наследование, используйте класс.
Я хотел унаследовать от модуля, и я это сделал:
import json
class custom_json(): pass
for i in json.__all__:
setattr(custom_json, i, getattr(json, i))
По крайней мере, это работает.
Если вы переопределите некоторые атрибуты, используйте это:
import json
class custom_json():
def dump():
pass
for i in json.__all__:
if not hasattr(custom_json, i):
setattr(custom_json, i, getattr(json, i))
class Base():
.....
class derived(Base):
......
Но это наследственный класс...
Позволь мне привести пример:
Base.py
import os
import sys
config = dict()
config['module_name'] = "some_xyz_thing"
config['description'] = "Implements xyz functionality"
Derived.py
from Base import config
config['module_name'] = "som_more_xyz_functionality"
Таким образом, вы можете использовать наследование на уровне модуля