2015-04-24 1 views
0

Я заинтересован в создании иерархии классов, где различные Примеси создания слотов в объекте:множественного наследования и Примеси для связывания объектов слотов в Python

class A(object, Keyable, Taggable): 
    """A is keyable and taggable.""" 
    def __init__(self): 
     super(A, self).__init__() 
     print "A" 

class B(BodyText, Valuable): 
    """B is everything a A is, plus Valuable""" 
    def __init__(self): 
     super(B, self).__init__() 
     print "B" 

class C(BodyKey, Posable): 
    """C is everything a B is, plus Posable""" 
    def __init__(self): 
     super(C, self).__init__() 
     print "C" 

Однако, когда я пытаюсь запустить этот код (наряду с указанным ниже Mixins) я получаю сообщение об ошибке «» «Невозможно создать последовательное разрешение метода порядка (MRO) для баз Keyable, Taggable, объекта„“»

Если есть другой способ для достижения своих целей (например, состав или что-то еще) Я открыт для него.

# BEGIN MIXINS 
class Posable(object): 
    def __init__(self): 
     super(Posable, self).__init__() 
     self.pos = 0 
     print "POSABLE" 

class Keyable(object): 
    def __init__(self): 
     super(Keyable, self).__init__() 
     self.key = '' 
     print "KEYABLE" 

class Taggable(object): 
    def __init__(self): 
     super(Taggable, self).__init__() 
     self.tag = '' 
     print "TAGGABLE" 

class Valuable(object): 
    def __init__(self): 
     super(Valuable, self).__init__() 
     self.val = 0 
     print "VALUABLE" 
# END MIXINS 
+0

Вам не нужно наследовать объект вообще в классе A. Также обратите внимание, что BodyText и BodyKey не определены в вашем вопросе. –

ответ

1

Try сдачи Примеси первый:

class A(Keyable, Taggable, object): 
    ... 

На самом деле, в этом случае, так как все ваши Mixins наследовать от object, вы действительно не нужно снова:

class A(Keyable, Taggable): 
    ... 

Ошибка возникает, когда вы пишете:

class A(object, Keyable, Taggable): 
    ... 

Вы хотите сказать, что питон Keyable предшествует Taggable поступающую к object в порядке разрешения методов (слева направо). Конечно, когда питон создает порядок разрешения метод, не может быть больше вещей, вставленных между ними, но в конце концов, MRO гарантированно выглядеть следующим образом:

[A, object, ... Keyable, ..., Taggable, ...] 

где ... может быть 0 или больше классов. К сожалению, в этом случае python не может построить этот mro, потому что KeyableTaggable) наследует от объекта (который сообщает python, что они должны прибыть до object в mro).

 Смежные вопросы

  • Нет связанных вопросов^_^