Jawaban:
Dalam versi Python sebelum 3.0 ada dua jenis string "string polos" dan "string unicode". String polos ( str
) tidak dapat mewakili karakter di luar alfabet Latin (mengabaikan detail halaman kode untuk kesederhanaan). String Unicode ( unicode
) dapat mewakili karakter dari alfabet apa pun termasuk beberapa yang fiksi seperti Klingon.
Jadi mengapa memiliki dua jenis string, bukankah lebih baik hanya memiliki Unicode karena itu akan mencakup semua kasus? Yah lebih baik hanya memiliki Unicode tetapi Python dibuat sebelum Unicode adalah metode yang disukai untuk mewakili string. Dibutuhkan waktu untuk mentransisikan tipe string dalam bahasa dengan banyak pengguna, dengan Python 3.0 akhirnya semua string adalah Unicode.
Hirarki warisan string Python pra-3.0 adalah:
object
|
|
basestring
/ \
/ \
str unicode
'basestring' diperkenalkan di Python 2.3 dapat dianggap sebagai langkah ke arah string unifikasi karena dapat digunakan untuk memeriksa apakah sebuah objek adalah instance dari str
atauunicode
>>> string1 = "I am a plain string"
>>> string2 = u"I am a unicode string"
>>> isinstance(string1, str)
True
>>> isinstance(string2, str)
False
>>> isinstance(string1, unicode)
False
>>> isinstance(string2, unicode)
True
>>> isinstance(string1, basestring)
True
>>> isinstance(string2, basestring)
True
basestring
dan str
dan bytes
kedua subkelas object
secara langsung. Tetapi perhatikan bahwa ini masuk akal, karena Py2 str
tidak sama dengan Py3 bytes
. basestring
harus dianggap sebagai "karakter string", yang hanya dimiliki oleh Py3 str
. Karenanya 2to3
alat ini diganti basestring
dengan str
.
Semua string adalah basestrings, tetapi string unicode bukan tipe str. Coba ini sebagai gantinya:
>>> a=u'aaaa'
>>> print isinstance(a, basestring)
True
>>> print isinstance(a, str)
False
Sungguh apa yang Anda tanyakan adalah perbedaan antara kelas dasar dan kelas str.
Str adalah kelas yang diwarisi dari basestr. Tetapi string unicode juga ada, seperti yang lainnya, jika Anda ingin membuatnya.
>>> a = u'aaaa'
>>> isinstance(a, str)
False
>>> isinstance(a, basestring)
True
str
danbyte
masih daribasestring
? Layak menambahkan catatan tentang ini.