Zastanawiałem się, jak sprawdzić, czy zmienna jest klasą (a nie instancją!), Czy nie.
Próbowałem użyć tej funkcji isinstance(object, class_or_type_or_tuple)
, ale nie wiem, jaki typ będzie miał klasa.
Na przykład w następującym kodzie
class Foo: pass
isinstance(Foo, **???**) # i want to make this return True.
Próbowałem zastąpić „ class
” ??? , ale zdałem sobie sprawę, że class
jest to słowo kluczowe w pythonie.
python
reflection
jeeyoungk
źródło
źródło
inspect.isclass
zwrócić,True
jeśli obiekt do sprawdzenia jest instancją klasy , użyjinspect.isclass(type(Myclass()))
type(whatever)
zawsze zwraca obiekt będący klasą, więc ta kontrola jest zbędna. Gdyby tak nie było, nie byłoby sposobu na utworzenie instancji,whatever
a zatem nie można było przeprowadzić kontroli w pierwszej kolejności.type(snakemake.utils)
zwraca<class 'module'>
i jeszczeinspect.isclass(snakemake.utils)
zwracaFalse
.snakemake.util
moduł nie jest klasą?Inspect.isclass jest prawdopodobnie najlepszym rozwiązaniem i naprawdę łatwo jest zobaczyć, jak jest faktycznie wdrożony
źródło
import types
types.ClassType
nie jest już potrzebny w Pythonie 3 (i został usunięty).In [8]: class NewStyle(object): ...: pass ...: In [9]: isinstance(NewStyle, (type, types.ClassType)) Out[9]: True
isinstance(object, type)
. Należy pamiętać, że obiekty podobaint
,list
,str
, itd. Są również zajęcia, więc nie można użyć tego odróżnić niestandardowych klas zdefiniowanych w Pythonie i wbudowanych klas zdefiniowanych w kodzie C .źródło
'class Old:pass' 'isinstance(Old, type) == False'
aleinspect.isclass(Old) == True
.Zwróć,
True
jeśliX
jest klasą, aFalse
jeśli nie.źródło
S. Lott's answer
jest o cztery lata starszy.Ta kontrola jest zgodna zarówno z Python 2.x, jak i Python 3.x.
Jest to w zasadzie funkcja otoki, która wykonuje to samo sprawdzenie, co w odpowiedzi andrea_crotti.
Przykład:
źródło
klasa Foo: nazywa się klasą starego stylu, a klasa X (obiekt): nazywa się klasą nowego stylu.
Sprawdź to Jaka jest różnica między starymi i nowymi klasami stylów w Pythonie? . Zalecany jest nowy styl. Przeczytaj o „ ujednolicaniu typów i klas ”
źródło
najprostszym sposobem jest użycie tego,
inspect.isclass
jak podano w najczęściej głosowanej odpowiedzi.szczegóły implementacji można znaleźć na python2 inspect i python3 inspect .
dla klasy w nowym stylu:
isinstance(object, type)
dla klasy w starym stylu:
isinstance(object, types.ClassType)
em, dla klasy w starym stylu, używa
types.ClassType
, oto kod z types.py :źródło
Benjamin Peterson ma rację co do wykorzystania
inspect.isclass()
tej pracy. Zauważ jednak, że możesz sprawdzić, czyClass
obiekt jest konkretnyClass
, a zatem domyślnie aClass
, używając wbudowanej funkcji issclcl . W zależności od przypadku użycia może to być bardziej pytoniczne.Następnie można go użyć w następujący sposób:
źródło
Istnieją już pewne działające rozwiązania, ale oto inne:
źródło
types.ClassType
został usunięty w Pythonie 3