Я пытаюсь создать класс mixin, который имеет свои собственные свойства, но поскольку класс не имеет init для инициализации «скрытой» переменной за свойством.Несколько миксинов и свойств
class Software:
__metaclass__ = ABCMeta
@property
def volumes(self):
return self._volumes
@volumes.setter
def volumes(self, value):
pass
class Base(object):
def __init__(self):
self._volumes = None
class SoftwareUser(Base, Software):
def __init__(self):
super(Base, self).__init__()
Так выше это лучшее, что я придумал, чтобы решить эту проблему, но реальность такова, что _volumes dosn't действительно принадлежат в базе. Я мог бы добавить init в класс Software, но тогда супер-вызов не будет работать на обоих микшинах.
Во-вторых, мне понадобится несколько микшинов, зависящих от входящего вызова, они всегда будут нуждаться в базе, но микшины будут меняться, поэтому мне не нужны переменные из микшинов, которые не смешиваются для этого вызова.
Есть ли способ, с помощью которого mixin может добавлять переменные в класс, если он смешивается, возможно, динамически вызывает init класса mixin ?.
Все вопросы дайте мне знать.
Благодаря
Непонятно мне, что вы подразумеваете под * «Я мог бы добавить init в класс Software, но тогда супер-вызов не будет работать на обоих mixins» *. Все три класса должны правильно реализовать '__init__' и инициализировать любые необходимые им атрибуты. – jonrsharpe
Итак, что я имею в виду, в приведенном выше примере добавьте инициализацию с переменной _volumes в класс программного обеспечения, но если я это сделаю, и она смешана с базовым классом, как в примере (SoftwareUser), тогда init класса Software не будет вызываться только Base init будет называться –
Нет, если вы их правильно реализуете, чтобы обеспечить выполнение любых других реализаций в MRO. Только 'Base' не следует называть' super', и он должен быть * последним * унаследованным классом. – jonrsharpe