Tentukan jenis objek Python
Tentukan jenis objek dengan type
>>> obj = object()
>>> type(obj)
<class 'object'>
Meskipun berfungsi, hindari atribut bergaris bawah ganda seperti __class__
- mereka tidak bersifat publik semantik, dan, meskipun mungkin tidak dalam kasus ini, fungsi bawaan biasanya memiliki perilaku yang lebih baik.
>>> obj.__class__ # avoid this!
<class 'object'>
memeriksa jenis
Apakah ada cara sederhana untuk menentukan apakah suatu variabel adalah daftar, kamus, atau sesuatu yang lain? Saya mendapatkan objek kembali yang mungkin tipe baik dan saya harus bisa membedakannya.
Nah itu pertanyaan yang berbeda, jangan gunakan tipe - gunakan isinstance
:
def foo(obj):
"""given a string with items separated by spaces,
or a list or tuple,
do something sensible
"""
if isinstance(obj, str):
obj = str.split()
return _foo_handles_only_lists_or_tuples(obj)
Ini mencakup kasus di mana pengguna Anda mungkin melakukan sesuatu yang pintar atau masuk akal dengan subkelas str
- sesuai dengan prinsip Pergantian Liskov, Anda ingin dapat menggunakan contoh subkelas tanpa melanggar kode Anda - dan isinstance
mendukung ini.
Gunakan Abstraksi
Bahkan lebih baik, Anda mungkin mencari Kelas Dasar Abstrak spesifik dari collections
atau numbers
:
from collections import Iterable
from numbers import Number
def bar(obj):
"""does something sensible with an iterable of numbers,
or just one number
"""
if isinstance(obj, Number): # make it a 1-tuple
obj = (obj,)
if not isinstance(obj, Iterable):
raise TypeError('obj must be either a number or iterable of numbers')
return _bar_sensible_with_iterable(obj)
Atau Hanya Jangan Ketikkan-centang secara eksplisit
Atau, mungkin yang terbaik, gunakan bebek-mengetik, dan jangan ketik-periksa kode Anda secara eksplisit. Mengetik bebek mendukung Substitusi Liskov dengan keanggunan yang lebih tinggi dan lebih sedikit.
def baz(obj):
"""given an obj, a dict (or anything with an .items method)
do something sensible with each key-value pair
"""
for key, value in obj.items():
_baz_something_sensible(key, value)
Kesimpulan
- Gunakan
type
untuk benar-benar mendapatkan kelas instance.
- Gunakan
isinstance
untuk secara eksplisit memeriksa subclass aktual atau abstraksi terdaftar.
- Dan hindari pengecekan tipe yang masuk akal.