type(), isinstance() เพื่อรับและกำหนดประเภทใน Python

ธุรกิจ

ใน Python ฟังก์ชันในตัว type() และ isinstance() จะใช้เพื่อรับและตรวจสอบประเภทของอ็อบเจกต์ เช่น ตัวแปร และเพื่อระบุว่าเป็นประเภทใดประเภทหนึ่ง

เนื้อหาต่อไปนี้อธิบายไว้ที่นี่ พร้อมกับโค้ดตัวอย่าง

  • รับและตรวจสอบประเภทวัตถุ: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
Copied title and URL