Immer name der Unterklasse aus der Oberklasse?

Ich habe eine base-Klasse bc und eine Reihe von Unterklassen, basierend auf bc.

class bc(Object):
  def get_subclass_name(self):
      # Retrieve the name of the most derived subclass of this instance
      pass
  def somemethod(self):
      x = self.get_subclass_name()

class sc1(bc):
    pass

class sc2(bc)
    pass

Die Idee ist, dass, wenn somemethod() aufgerufen wird, eine Instanz einer Unterklasse von bc es wird in der Lage sein, die Namen der meisten abgeleiteten Unterklasse, die von dieser Instanz ohne im Voraus zu wissen, was potentielle Unterklassen existieren können.

Ich haben zusammen ein Testfall:

class base_class(object):
    @classmethod
    def get_subclass_name(cls):
        return cls.__name__

    def somemethod(self):
        print(base_class.get_subclass_name())

class sub_class(base_class):
    pass

sub_class().somemethod()

Wenn dieser code ausgeführt wird, erzeugt es base_class eher als sub_class.

  • Was bedeutet es the most derived subclass ?
  • Wenn Sie eine Klasse bc und eine Unterklasse sc1 abgeleitet aus bc und anderen Unterklasse sc2 abgeleitet aus sc1, dann ist die Unterklasse sc2 wird der am meisten abgeleiteten Klasse bc für jede Instanz von sc2..
  • Was, wenn es eine andere class sc3(sc2), ist die "am meisten abgeleiteten Unterklasse" für eine Instanz von sc2 dann sc3 oder noch sc2?
  • Vielleicht sollten Sie versuchen Metaklassen für diese?
  • Ich sah Sie an Metaklassen, konnte aber nicht sehen, wie Sie helfen würde, in diesem speziellen Fall.
  • Ich spreche über das abrufen von den Namen der aktuellen Klasse eine Instanz von einer Methode in einer Superklasse von der Klassen-Instanz.
  • Das ist es, was Klassen Methoden zu tun...
  • Bitte geben Sie einen Testfall an, was Sie zu erreichen versuchen.
  • print(base_class.get_subclass_name()) Hinweis: diese Zeile! Rufen Sie es mit self, als es funktioniert. Sie sind explizit die Weitergabe der Basisklasse, nicht auf die aktuelle Klasse.

InformationsquelleAutor Jonathan | 2013-10-12
Schreibe einen Kommentar