Saya bertanya-tanya bagaimana cara memeriksa apakah variabel adalah kelas (bukan sebuah instance!) Atau tidak.
Saya sudah mencoba menggunakan fungsi isinstance(object, class_or_type_or_tuple)
untuk melakukan ini, tetapi saya tidak tahu tipe apa yang akan dimiliki sebuah kelas.
Misalnya, dalam kode berikut
class Foo: pass
isinstance(Foo, **???**) # i want to make this return True.
Saya mencoba mengganti " class
" dengan ??? , tetapi saya menyadari bahwa itu class
adalah kata kunci dalam python.
python
reflection
Astaga
sumber
sumber
inspect.isclass
kembaliTrue
jika objek yang diperiksa adalah instance kelas , gunakaninspect.isclass(type(Myclass()))
type(whatever)
selalu mengembalikan objek yang merupakan kelas, jadi pemeriksaan ini berlebihan. Jika tidak, tidak akan ada cara untuk instantiatewhatever
dan dengan demikian Anda tidak bisa melakukan pemeriksaan di tempat pertama.type(snakemake.utils)
kembali<class 'module'>
daninspect.isclass(snakemake.utils)
kembaliFalse
.snakemake.util
modul bukan kelas?Inspect.isclass mungkin merupakan solusi terbaik, dan sangat mudah untuk melihat bagaimana itu sebenarnya diimplementasikan
sumber
import types
types.ClassType
tidak lagi diperlukan dalam Python 3 (dan dihapus).In [8]: class NewStyle(object): ...: pass ...: In [9]: isinstance(NewStyle, (type, types.ClassType)) Out[9]: True
isinstance(object, type)
. Perhatikan bahwa benda-benda sepertiint
,list
,str
, dll juga kelas, sehingga Anda tidak dapat menggunakan ini untuk membedakan antara kelas kustom didefinisikan dalam Python dan built-in kelas didefinisikan dalam kode C .sumber
'class Old:pass' 'isinstance(Old, type) == False'
tapiinspect.isclass(Old) == True
.Kembali
True
jikaX
kelas danFalse
jika tidak.sumber
S. Lott's answer
, yaitu empat tahun lebih tua.Pemeriksaan ini kompatibel dengan Python 2.x dan Python 3.x.
Ini pada dasarnya adalah fungsi pembungkus yang melakukan pemeriksaan yang sama seperti pada jawaban andrea_crotti.
Contoh:
sumber
class Foo: disebut kelas gaya lama dan kelas X (objek): disebut kelas gaya baru.
Periksa ini Apa perbedaan antara kelas gaya lama dan gaya baru di Python? . Gaya baru direkomendasikan. Baca tentang " tipe dan kelas pemersatu "
sumber
Cara paling sederhana adalah menggunakan
inspect.isclass
sebagaimana diposting dalam jawaban yang paling banyak dipilih.detail implementasi dapat ditemukan di python2 inspect dan python3 inspect .
untuk kelas gaya baru:
isinstance(object, type)
untuk kelas gaya lama:
isinstance(object, types.ClassType)
em, untuk kelas gaya lama, yang digunakan
types.ClassType
, berikut adalah kode dari types.py :sumber
Benjamin Peterson benar tentang penggunaan
inspect.isclass()
untuk pekerjaan ini. Tetapi perhatikan bahwa Anda dapat menguji apakah suatuClass
objek adalah spesifikClass
, dan karenanya secara implisit aClass
, menggunakan fungsi built-in issubclass . Tergantung pada kasus penggunaan Anda, ini bisa lebih pythonic.Kemudian dapat digunakan seperti ini:
sumber
Sudah ada beberapa solusi yang berfungsi di sini, tetapi ini satu lagi:
sumber
types.ClassType
telah dihapus dengan Python 3