Den Setzer einer Superklasse in einem Mixin anrufen

Angenommen, ich habe die folgenden (nicht ganz biologisch korrekten) Klassen:

class AnimalBaseClass: def __init__(self): self._limbs = None @property def limbs(self): return self._limbs @limbs.setter def limbs(self, value): self.paws = value self._limbs = value class BipedalMixIn: @property def limbs(self): return super().limbs @limbs.setter def limbs(self, value): self.bipedal = (value == 2) # does not work super().limbs = value 

Hier wird super().limbs = value wird nicht von python unterstützt . Wenn BipedalMixIn kein Mixin war, könnte ich den Namen der BipedalMixIn direkt nutzen, aber gibt es irgendeine einfache Alternative, um den Super Class's Setter in einem Mixin zu rufen?

  • Unterschied zwischen Super- und übergeordneter Klassenname
  • Python Super-Methode und rufen Alternativen
  • Python super (Klasse, Selbst) .method vs super (Elternteil, Selbst)
  • Python 2.7 super () Fehler
  • Gibt es einen Grund, nicht zu senden super () .__ init __ () ein Wörterbuch anstelle von ** kwds?
  • Super () und @staticmethod interaktion
  • [Python]: verwirrt von super ()
  • Wie macht Pythons "Super" das Richtige?
  • 2 Solutions collect form web for “Den Setzer einer Superklasse in einem Mixin anrufen”

    Die folgenden Arbeiten, obwohl irgendwelche einfacheren Antworten geschätzt werden.

     class AnimalBaseClass: def __init__(self): self._limbs = None @property def limbs(self): return self._limbs @limbs.setter def limbs(self, value): self.paws = value self._limbs = value class BipedalMixIn: @property def limbs(self): return super().limbs @limbs.setter def limbs(self, value): self.bipedal = (value == 2) # works! super(BipedalMixIn, self.__class__).limbs.__set__(self, value) class Bird(BipedalMixIn, AnimalBaseClass): pass bird = Bird() bird.limbs = 2 print(bird.bipedal) # True print(bird.paws) # 2 

    Erstens, wenn Sie unter Python 2.x arbeiten, stellen Sie sicher, dass alle Ihre Klassen direkt oder indirekt vom object erben. Ansonsten @property überhaupt nicht.

    Um den Beispielcode aus diesem Kommentar in OP's verknüpften Bug zu stehlen:

     super(BipedalMixin, BipedalMixin).limbs.__set__(self, value) 

    Lass uns das auseinander brechen:

     super(BipedalMixin, BipedalMixin) 

    Normalerweise übergeben wir eine Instanz als erstes Argument. Hier sind wir stattdessen eine Klasse vorbei, um Klassenattribute auszusehen und jede Descriptormagie zu deaktivieren.

     .limbs.__set__(self, value) 

    Dies ruft die __set__() -Methode der Eigenschaft auf, die den Setter aufruft. Normalerweise wird es automatisch durch die Syntax foo.limbs = bar aufgerufen.

    Python ist die beste Programmiersprache der Welt.