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 vonsc2
dannsc3
oder nochsc2
? - 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 mitself
, als es funktioniert. Sie sind explizit die Weitergabe der Basisklasse, nicht auf die aktuelle Klasse.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur als alternative zu @poorsod-Lösung, die perfekt funktioniert gut für mich, hier ist eine andere, vielleicht einfachere Variante ohne Klasse Methoden, mit
self.__class__
. Nur alsself
zeigt immer auf die aktuelle Instanzself.__class__
immer auf das tatsächliche Klasse dieser Instanz.Beispiel, getestet in Python 2.6.6:
Wenn dies nicht funktioniert, bitte etwas konkreter, welche Leistung Sie erwarten und welche Leistung Sie bekommen stattdessen.
sc2
der eigentlichen Klasse der Instanz, die als eine Instanz vonsc2
erstellt:sc2().get_...
.sc3
gibt es nur für die Vermeidung der Mehrdeutigkeit von "die meisten abgeleitete Klasse".class c
und wollen es den Namen? Nur tunc.__name__
? Oder wollen Sie die Namen einiger Unterklasse vonc
? Wenn ja, die Unterklasse zu nehmen (es gibt viele), ohne eine Instanz der Unterklasse?Benötigen Sie eine - Klasse-Methode.
Normalen Methoden, wenn Sie aufgerufen wird, übergeben bekommen Instanz als ersten parameter. Dies ist, warum Sie sehen
self
überall in Python.Beim Aufruf einer Methode der Klasse, aber die konkrete Klasse der Instanz an die Funktion übergeben wird. Wir verwenden in der Regel den Namen
cls
, wie ich es hier getan habe.Den klassischen Anwendungsfall für eine Klasse von Methoden ist alternative Konstruktoren. Zum Beispiel die standard-Bibliothek
dict
- Klasse bietet einefromkeys
Methode der Klasse, die erstellt ein neues dict-von der mitgelieferten Schlüsseln und einen einzelnen Wert. Sie bauen könnten, die eine solche dict manuell, aber die Python-Entwickler das Leben leicht für Sie!self.__class__
?get_subclass_name
auf eine Instanz vonsc
werde es zurück'sc'
.self.__class__
, aber es ist sehr mehr Pythonic (es ist weniger ausführlich und mehr explicit).