در پایتون، توابع داخلی type() و ininstance() برای دریافت و بررسی نوع یک شی، مانند یک متغیر، و تعیین اینکه آیا از نوع خاصی است یا خیر استفاده می شود.
- 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()
- تعیین نوع با استفاده از 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