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?

  • Python, Vererbung, super () Methode
  • "MetaClass", "__new__", "cls" und "super" - was ist der Mechanismus genau?
  • Super () hebt "TypeError: muss Typ sein, nicht classobj" für neuartigen Klasse
  • Python-Mehrfachvererbung: Vermeiden Sie es, die Konstrukteure zweimal in Diamantenform zu rufen
  • [Python]: verwirrt von super ()
  • Was ist ein grundlegendes Beispiel für einzelne Vererbung mit dem super () Schlüsselwort in Python?
  • Wie vermeiden Sie unendliche Rekursion mit super ()?
  • Verständnis Python super () mit __init __ () Methoden [duplizieren]
  • 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.