Powiedzmy, że mam garnitur klasy i cztery podklasy garnituru: Serce, Szpadel, Diament, Klub.
class Suit:
...
class Heart(Suit):
...
class Spade(Suit):
...
class Diamond(Suit):
...
class Club(Suit):
...
Mam metodę, która odbiera kolor jako parametr, który jest obiektem klasy, a nie instancją. Dokładniej, może otrzymać tylko jedną z czterech wartości: Serce, Szpadel, Diament, Klub. Jak mogę złożyć twierdzenie, które zapewni takie rozwiązanie? Coś jak:
def my_method(suit):
assert(suit subclass of Suit)
...
Używam Python 3.
my_method
można uzyskać jako parametry: „może otrzymać tylko jedną z czterech wartości: Serce, Szpadel, Diament, Klub”. Te wartości są obiektami klasy, a nie instancjami klasy. Wydaje mi się to dość jasne, choć przypuszczam, że masz rację co do niejasności, ponieważ odpowiedzi obejmują obie możliwości. Z przyjemnością edytujesz pytanie, jeśli masz na to wyraźniejsze sformułowanie. Dziękuję za komentarz._class
, czyniąc je podobnymisuit_class
. I zaproponował taką konwencję nazywania w odpowiednim pytaniem .my_method(Heart)
my_method(Spade)
...inspect.isclass
lub po prostu użyć goisinstance(myvar, type)
w Pythonie 3, ponieważissubclass
spowoduje to błąd, jeśli zostanie przekazany nieklasowy. Zobacz tę odpowiedź . Skomentowałbym odpowiedź poniżej, ale nigdy nie ujrzałaby światła dziennego.Odpowiedzi:
Możesz użyć w
issubclass()
ten sposóbassert issubclass(suit, Suit)
.źródło
issubclass(class, classinfo)
Fragment:
źródło
Możesz użyć,
isinstance
jeśli masz instancję lubissubclass
klasę. Zwykle uważał to za zły pomysł. Zwykle w Pythonie sprawdzasz, czy obiekt jest zdolny do czegoś, próbując to zrobić.źródło
Funkcja
issubclass(sub, sup)
boolowska zwraca true, jeśli podklasasub
jest rzeczywiście podklasą nadklasysup
.źródło
issubclass
minimalny możliwy do uruchomienia przykładOto bardziej kompletny przykład z pewnymi twierdzeniami:
GitHub w górę .
Testowane w języku Python 3.5.2.
źródło
Możesz użyć wbudowanej podklasy. Ale sprawdzanie typu jest zwykle postrzegane jako niepotrzebne, ponieważ można używać pisania kaczego.
źródło
Korzystanie z Issubclass wydawało się czystym sposobem pisania loglevels. To trochę dziwne, używając go ... ale wydaje się czystsze niż inne opcje.
źródło
Zgodnie z dokumentacją Pythona możemy również użyć
class.__mro__
atrybutu lubclass.mro()
metody:źródło
źródło