type()، ininstance() برای دریافت و تعیین نوع در پایتون

کسب و کار

در پایتون، توابع داخلی type() و ininstance() برای دریافت و بررسی نوع یک شی، مانند یک متغیر، و تعیین اینکه آیا از نوع خاصی است یا خیر استفاده می شود.

در اینجا مطالب زیر به همراه کد نمونه توضیح داده شده است.

  • دریافت و بررسی نوع شی:type()
  • تعیین نوع شی:type(),isinstance()
    • تعیین نوع با استفاده از type()
    • تعیین نوع با استفاده از ininstance()
    • تفاوت بین type() و ininstance()

به جای تعیین نوع یک شی، می توان از مدیریت استثنا یا تابع داخلی hasattr() برای تعیین اینکه آیا یک شی دارای متدها و ویژگی های صحیح است یا خیر استفاده کرد.

دریافت و بررسی نوع شی:type()

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() یا ininstance() استفاده کنید.

تعیین نوع با استفاده از 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 و یک تاپل یا لیستی از چندین نوع استفاده کنید.

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

تعیین نوع با استفاده از ininstance()

ininstance(شیء، کلاس) تابعی است که اگر شیء آرگومان اول نمونه ای از نوع یا زیر کلاس آرگومان دوم باشد، مقدار true را برمی گرداند.

آرگومان دوم می تواند چندین نوع باشد. اگر نمونه ای از هر نوع باشد، true برگردانده می شود.

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() و ininstance()

تفاوت بین type() و isinstance() در این است که isinstance() برای نمونه هایی از کلاس های فرعی که کلاس مشخص شده به عنوان آرگومان دوم را به ارث می برند true برمی گرداند.

به عنوان مثال، سوپرکلاس (کلاس پایه) و زیر کلاس (کلاس مشتق شده) زیر تعریف شده اند.

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() حتی برای superclass ها true را برمی گرداند.

print(type(derive) is Derive)
# True

print(type(derive) is Base)
# False

print(isinstance(derive, Derive))
# True

print(isinstance(derive, Base))
# True

حتی برای انواع استاندارد، به عنوان مثال، نوع Boolean bool (درست، نادرست)، باید مراقب بود. 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