Katakanlah saya memiliki Suit kelas dan empat subclass suit: Heart, Spade, Diamond, Club.
class Suit:
...
class Heart(Suit):
...
class Spade(Suit):
...
class Diamond(Suit):
...
class Club(Suit):
...
Saya memiliki metode yang menerima setelan sebagai parameter, yang merupakan objek kelas, bukan instance. Lebih tepatnya, itu mungkin hanya menerima satu dari empat nilai: Heart, Spade, Diamond, Club. Bagaimana saya bisa membuat pernyataan yang memastikan hal seperti itu? Sesuatu seperti:
def my_method(suit):
assert(suit subclass of Suit)
...
Saya menggunakan Python 3.
my_method
dapat diperoleh sebagai parameter: "mungkin hanya menerima satu dari empat nilai: Heart, Spade, Diamond, Club". Nilai-nilai itu adalah objek kelas, bukan instance kelas. Tampaknya cukup jelas bagi saya, meskipun saya kira Anda benar tentang ketidakjelasan karena jawabannya mencakup kedua kemungkinan. Anda dipersilakan untuk mengedit pertanyaan jika Anda memiliki kata yang lebih jelas untuk itu. Terima kasih atas komentarnya._class
, menjadikannya sepertisuit_class
. Saya mengusulkan konvensi penamaan seperti itu dalam pertanyaan yang relevan .my_method(Heart)
my_method(Spade)
...inspect.isclass
atau hanya menggunakanisinstance(myvar, type)
Python 3, karenaissubclass
akan memunculkan kesalahan jika melewati non-kelas. Lihat jawaban ini . Saya akan mengomentari jawaban di bawah ini, tetapi tidak akan pernah melihat cahaya hari.Jawaban:
Anda bisa menggunakan
issubclass()
seperti iniassert issubclass(suit, Suit)
.sumber
issubclass(class, classinfo)
Kutipan:
sumber
Anda dapat menggunakan
isinstance
jika Anda memiliki instance, atauissubclass
jika Anda memiliki kelas. Biasanya berpikir itu ide yang buruk. Biasanya dalam Python Anda bekerja jika suatu objek mampu melakukan sesuatu dengan mencoba melakukan hal itu padanya.sumber
Fungsi
issubclass(sub, sup)
boolean mengembalikan true jika subclass yang diberikansub
memang merupakan subclass dari superclasssup
.sumber
issubclass
contoh runnable minimalBerikut adalah contoh yang lebih lengkap dengan beberapa pernyataan:
GitHub hulu .
Diuji dalam Python 3.5.2.
sumber
Anda bisa menggunakan builtin issubclass. Tetapi pengecekan tipe biasanya dianggap tidak perlu karena Anda bisa menggunakan bebek-mengetik.
sumber
Menggunakan issubclass sepertinya cara yang bersih untuk menulis loglevels. Agak terasa aneh menggunakannya ... tapi sepertinya lebih bersih daripada opsi lain.
sumber
Menurut dokumen Python , kita juga bisa menggunakan
class.__mro__
atribut atauclass.mro()
metode:sumber
sumber