Nehmen wir an, ich habe einen Klassenanzug und vier Unterklassen von Anzügen: Herz, Spaten, Diamant, Verein.
class Suit:
...
class Heart(Suit):
...
class Spade(Suit):
...
class Diamond(Suit):
...
class Club(Suit):
...
Ich habe eine Methode, die eine Farbe als Parameter erhält, die ein Klassenobjekt ist, keine Instanz. Genauer gesagt kann es nur einen der vier Werte erhalten: Herz, Spaten, Diamant, Verein. Wie kann ich eine Aussage machen, die so etwas gewährleistet? Etwas wie:
def my_method(suit):
assert(suit subclass of Suit)
...
Ich benutze Python 3.
my_method
als Parameter erhalten werden können: "Es kann nur einen der vier Werte erhalten: Herz, Spaten, Diamant, Schläger". Diese Werte sind Klassenobjekte, keine Klasseninstanzen. Es scheint mir ziemlich klar zu sein, obwohl ich vermute, dass Sie in Bezug auf die Unbestimmtheit Recht haben, da die Antworten beide Möglichkeiten abdecken. Sie können die Frage gerne bearbeiten, wenn Sie eine klarere Formulierung dafür haben. Danke für den Kommentar._class
dass sie wiesuit_class
. Ich habe eine solche Namenskonvention in einer relevanten Frage vorgeschlagen .my_method(Heart)
my_method(Spade)
...inspect.isclass
oder einfachisinstance(myvar, type)
in Python 3 verwenden, da diesissubclass
einen Fehler auslöst, wenn eine Nichtklasse übergeben wird. Siehe diese Antwort . Ich hätte die Antwort unten kommentiert, aber sie hätte nie das Licht der Welt erblickt.Antworten:
Sie können verwendet werden,
issubclass()
wie dieseassert issubclass(suit, Suit)
.quelle
issubclass(class, classinfo)
Auszug:
quelle
Sie können verwenden,
isinstance
wenn Sie eine Instanz haben oderissubclass
wenn Sie eine Klasse haben. Normalerweise dachte es ist eine schlechte Idee. Normalerweise ermitteln Sie in Python, ob ein Objekt zu etwas fähig ist, indem Sie versuchen, das zu tun.quelle
Die
issubclass(sub, sup)
boolesche Funktion gibt true zurück, wenn die angegebene Unterklassesub
tatsächlich eine Unterklasse der Oberklasse istsup
.quelle
issubclass
minimales lauffähiges BeispielHier ist ein vollständigeres Beispiel mit einigen Behauptungen:
GitHub stromaufwärts .
Getestet in Python 3.5.2.
quelle
Sie können die integrierte issubclass verwenden. Die Typprüfung wird jedoch normalerweise als unnötig angesehen, da Sie die Ententypisierung verwenden können.
quelle
Die Verwendung von issubclass schien eine saubere Möglichkeit zu sein, Googlevels zu schreiben. Es fühlt sich irgendwie seltsam an, es zu benutzen ... aber es scheint sauberer als andere Optionen.
quelle
Laut Python-Dokument können wir auch
class.__mro__
Attribute oderclass.mro()
Methoden verwenden:quelle
quelle