تفاوت بین type و isinstance در پایتون — به زبان ساده

۲۹۳ بازدید
آخرین به‌روزرسانی: ۰۴ مهر ۱۴۰۲
زمان مطالعه: ۲ دقیقه
تفاوت بین type و isinstance در پایتون — به زبان ساده

در پایتون هر شیء یک نوع داده دارد که می‌تواند داخلیِ زبان یا سفارشی باشد. همچنین این نوع داده می‌تواند int، یک رشته str یک آرایه NumPy به صورت numpy.array و یا هر چیز دیگر باشد. یا این که می‌تواند یک شیء از کلاسی خود-تعریف باشد. با ما همراه باشید تا در ادامه این مقاله با تفاوت بین type و isinstance در پایتون آشنا شویم.

با فرض وجود شیء obj، برای بازگرداندن نوع داده شیء می‌توانیم از type(obj) استفاده کنیم. از سوی دیگر isintance(obj, dtype) در صورتی که شیء یک وهله از dtype مقدار true و در غیر این صورت مقدار false بازگشت می‌دهد. اما شاید بپرسید منظور از یک وهله از کلاس چیست؟

زیرکلاس و ارث‌بری

قبل از هر چیز باید مفهوم زیرکلاس و ارث‌بری را درک کنیم.

به عنوان نمونه به کد زیر توجه کنید:

1class Shape:
2    pass
3
4class Rectangle(Shape):
5    def __init__(self, length, width):
6        self.length = length
7        self.width = width
8        self.area = length * width
9    
10    def get_area(self):
11        return self.length * self.width
12        
13class Square(Rectangle):
14    def __init__(self,length):
15        Rectangle.__init__(self,length,length)

ما کلاس Rectangle(Shape) را به عنوان یک زیرکلاس از Shape تعریف می‌کنیم و Square(Rectangle) نیز یک زیرکلاس از Rectangle است. زیرکلاس اقدام به ارث‌بری متدها، مشخصه‌ها و دیگر کارکردهای سوپرکلاس خود می‌کند.

این سلسله مراتب به ترتیبی تعریف می‌شود‌‌ که یک شیء از کلاس Square همه مشخصه‌ها و متدهای Rectangle را به ارث ببرد. در نهایت یک مربع حالت خاصی از یک مستطیل خواهد بود که طول همه اضلاع آن برابر است.

اگر یک شیء Square با نام a و با مشخصه length=5 بسازیم، می‌توانیم متد ()get_area را برای محاسبه مساحت آن فراخوانی کنیم. توجه داشته باشید که این متد به صورت صریح درون کلاس Square تعریف نشده است، بلکه در سوپرکلاس آن یعنی Rectangle مشخص شده است:

1a = Square(5)
2a.get_area() # 25

از این رو می‌گوییم که Square(Rectangle) اقدام به ارث‌بری متد ()get_area از سوپرکلاس خود یعنی Rectangle کرده است.

وهله

شما احتمالاً اکنون درکی مقدماتی از مفهوم زیرکلاس و ارث‌بری به دست آورده‌اید. اما شاید ارتباط آن را با ()type و ()isinstance ندانید. گزاره‌های زیر را در رابطه با شیء مربع به نام a در نظر بگیرید. این دو گزاره چه چیزی بازگشت می‌دهند؟ آیا هر دو مقدار True یا False بازگشت می‌دهند؟

1type(a) == Rectangle
2isinstance(a, Rectangle)

ابتدا باید بگوییم که قطعاً type(a) مقدار Square را بازگشت می‌دهد. همچنین می‌دانیم کلاس Square برابر با کلاس Rectangle نیست بنابراین گزاره نخست مقدار False بازمی‌گرداند.

1Square == Rectangle # returns False

با این حال، گزاره دوم مقدار True بازگشت می‌دهد. دلیلش این است که Square یک زیرکلاس از Rectangle است و از این رو شیء a یک وهله از Rectangle محسوب می‌شود. وهله‌ی زیرکلاس یک وهله از کلاس مبنا نیز محسوب می‌شود.

سخن پایانی

متد ()isinstance، ارث‌بری را در نظر می‌گیرد، اما بررسی ()type یک شیء با استفاده از equality به صورت == این خصوصیت را ندارد. یعنی یک زیرکلاس با کلاس مبنای خود برابر نیست. به این ترتیب به پایان این مقاله می‌رسیم.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۱ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
towardsdatascience
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *