ใน Python ฟังก์ชันในตัว type() และ isinstance() จะใช้เพื่อรับและตรวจสอบประเภทของอ็อบเจกต์ เช่น ตัวแปร และเพื่อระบุว่าเป็นประเภทใดประเภทหนึ่ง
- class type(object) — Built-in Functions — Python 3.10.4 Documentation
- isinstance(object, classinfo) — Built-in Functions — Python 3.10.4 Documentation
เนื้อหาต่อไปนี้อธิบายไว้ที่นี่ พร้อมกับโค้ดตัวอย่าง
- รับและตรวจสอบประเภทวัตถุ:
type()
- การกำหนดประเภทอ็อบเจ็กต์:
type()
,isinstance()
- การกำหนดประเภทโดยใช้ type()
- การกำหนดประเภทโดยใช้ isinstance()
- ความแตกต่างระหว่าง type() และ isinstance()
แทนที่จะกำหนดประเภทของวัตถุ เราสามารถใช้การจัดการข้อยกเว้นหรือฟังก์ชัน hasattr() ในตัวเพื่อกำหนดว่าวัตถุมีวิธีการและแอตทริบิวต์ที่ถูกต้องหรือไม่
รับและตรวจสอบประเภทวัตถุ:พิมพ์()
type(object) เป็นฟังก์ชันที่คืนค่าชนิดของวัตถุที่ส่งผ่านเป็นอาร์กิวเมนต์ สามารถใช้เพื่อค้นหาประเภทของวัตถุ
print(type('string'))
# <class 'str'>
print(type(100))
# <class 'int'>
print(type([0, 1, 2]))
# <class 'list'>
ค่าส่งคืนของ type() เป็นอ็อบเจ็กต์ประเภท เช่น str หรือ int
print(type(type('string')))
# <class 'type'>
print(type(str))
# <class 'type'>
การกำหนดประเภทอ็อบเจ็กต์:type(),isinstance()
ใช้ type() หรือ isinstance() เพื่อกำหนดประเภท
การกำหนดประเภทโดยใช้ type()
โดยการเปรียบเทียบค่าส่งคืนของ type() กับประเภทใดๆ ก็สามารถระบุได้ว่าอ็อบเจกต์นั้นเป็นประเภทใด
print(type('string') is str)
# True
print(type('string') is int)
# False
def is_str(v):
return type(v) is str
print(is_str('string'))
# True
print(is_str(100))
# False
print(is_str([0, 1, 2]))
# False
หากคุณต้องการตรวจสอบว่าเป็นหนึ่งในหลายประเภทหรือไม่ ให้ใช้ตัวดำเนินการ in และ tuple หรือรายการหลายประเภท
def is_str_or_int(v):
return type(v) in (str, int)
print(is_str_or_int('string'))
# True
print(is_str_or_int(100))
# True
print(is_str_or_int([0, 1, 2]))
# False
นอกจากนี้ยังสามารถกำหนดฟังก์ชันที่เปลี่ยนแปลงการประมวลผลขึ้นอยู่กับประเภทอาร์กิวเมนต์
def type_condition(v):
if type(v) is str:
print('type is str')
elif type(v) is int:
print('type is int')
else:
print('type is not str or int')
type_condition('string')
# type is str
type_condition(100)
# type is int
type_condition([0, 1, 2])
# type is not str or int
การกำหนดประเภทโดยใช้ isinstance()
isinstance(object, class) เป็นฟังก์ชันที่คืนค่า จริง หากวัตถุของอาร์กิวเมนต์แรกเป็นอินสแตนซ์ของประเภทหรือคลาสย่อยของอาร์กิวเมนต์ที่สอง
อาร์กิวเมนต์ที่สองอาจเป็นทูเพิลประเภท หากเป็นอินสแตนซ์ของประเภทใดประเภทหนึ่ง ค่าจริงจะถูกส่งคืน
print(isinstance('string', str))
# True
print(isinstance(100, str))
# False
print(isinstance(100, (int, str)))
# True
ฟังก์ชันที่คล้ายกับตัวอย่างการกำหนดประเภทโดยใช้ type() สามารถเขียนได้ดังนี้
def is_str(v):
return isinstance(v, str)
print(is_str('string'))
# True
print(is_str(100))
# False
print(is_str([0, 1, 2]))
# False
def is_str_or_int(v):
return isinstance(v, (int, str))
print(is_str_or_int('string'))
# True
print(is_str_or_int(100))
# True
print(is_str_or_int([0, 1, 2]))
# False
def type_condition(v):
if isinstance(v, str):
print('type is str')
elif isinstance(v, int):
print('type is int')
else:
print('type is not str or int')
type_condition('string')
# type is str
type_condition(100)
# type is int
type_condition([0, 1, 2])
# type is not str or int
ความแตกต่างระหว่าง type() และ isinstance()
ความแตกต่างระหว่าง type() และ isinstance() คือ isinstance() คืนค่า จริง สำหรับอินสแตนซ์ของคลาสย่อยที่สืบทอดคลาสที่ระบุเป็นอาร์กิวเมนต์ที่สอง
ตัวอย่างเช่น ซูเปอร์คลาสต่อไปนี้ (คลาสพื้นฐาน) และคลาสย่อย (คลาสที่ได้รับมา) ถูกกำหนด
class Base:
pass
class Derive(Base):
pass
base = Base()
print(type(base))
# <class '__main__.Base'>
derive = Derive()
print(type(derive))
# <class '__main__.Derive'>
การกำหนดประเภทโดยใช้ type() คืนค่า true เฉพาะเมื่อประเภทตรงกัน แต่ isinstance() คืนค่า true แม้กระทั่งสำหรับ superclasses
print(type(derive) is Derive)
# True
print(type(derive) is Base)
# False
print(isinstance(derive, Derive))
# True
print(isinstance(derive, Base))
# True
แม้แต่สำหรับประเภทมาตรฐาน เช่น บูลประเภทบูลีน (จริง เท็จ) ยังต้องระมัดระวัง bool เป็นคลาสย่อยของประเภทจำนวนเต็ม ดังนั้น isinstance() คืนค่า true แม้กระทั่งสำหรับ int ที่สืบทอดมา
print(type(True))
# <class 'bool'>
print(type(True) is bool)
# True
print(type(True) is int)
# False
print(isinstance(True, bool))
# True
print(isinstance(True, int))
# True
หากคุณต้องการกำหนดประเภทที่แน่นอน ให้ใช้ type(); หากคุณต้องการกำหนดประเภทโดยคำนึงถึงการสืบทอด ให้ใช้ isinstance()
นอกจากนี้ยังมีฟังก์ชัน issubclass() ในตัวเพื่อกำหนดว่าคลาสนั้นเป็นคลาสย่อยของคลาสอื่นหรือไม่
print(issubclass(bool, int))
# True
print(issubclass(bool, float))
# False