تابع type در پایتون یک تابع پیشساخته (built-in) است که دو کاربرد اصلی دارد: مشخص کردن کلاس دقیق یک شیء و همچنین ایجاد کلاسهای جدید به صورت پویا در زمان اجرا (runtime). در این مقاله، هر دو جنبه تابع type را بررسی میکنیم؛ از جمله نحوه استفاده از آن، کاربردهای رایج در کنار کلاسهای داخلی و کلاسهای سفارشی و نقش آن در ساخت دینامیک کلاسها. بدون مقدمه بیشتر، مستقیماً سراغ بررسی سینتکس آن میرویم.
فهرست مطالب
سینتکس تابع type
سینتکس کلی تابع type به دو صورت زیر است:
type(object)
type(name, bases, dict, **kwargs)
پارامترها یا آرگومانهای این سینتکس عبارتند از:
- آرگومان
objectمیتواند هر آبجکت پایتونی باشد. - آرگومان
nameیک استرینگ است که اسم کلاس سفارشی را مشخص میکند. - آرگومان
basesیک تاپل است که کلاسهای والد را برای این کلاس سفارشی مشخص میکند. - آرگومان
dictیک دیکشنری است که اتریبیوتها و متدهای کلاس سفارشی را مشخص میکند. - سایر آرگومانهای کلیدی که میخواهید به سازنده متاکلاس ارسال کنید در قالب آرگومان
kwargs**تعریف میشوند.
مقدار بازگشتی تابع پایتونی type میتواند دو شکل داشته باشد:
- اگر به صورت ۱ آرگومانی فراخوانی شود، مقدار بازگشتی تابع برابر با تایپ آبجکت ورودی است.
- اگر به صورت ۳ آرگومانی فراخوانی شود، مقدار بازگشتی تابع برابر با کلاس سفارشی ایجاد شده است.
کاربردهای تابع type
۱) مشخص کردن کلاس یک شیء
هنگامی که شما یک شیء یا همان آبجکت را به تابع type میدهید، نوع یا تایپ آن داده را بر میگرداند:
# syntax
type(object)
# example
>>> type(42)
<class 'int'>
>>> type(2.75)
<class 'float'>
>>> type("Hello")
<class 'str'>
۲) ایجاد کلاسهای جدید به صورت پویا
شما میتوانید کلاس سفارشی خود را به صورت پویا با استفاده از این تابع تعریف کنید:
# syntax
type(name, bases, dict, **kwargs)
به عنوان مثال:
>>> DemoClass = type("DemoClass", (), {"value": 42})
>>> instance = DemoClass()
>>> instance.value
42
در اینجا کلاس سفارشی DemoClass با استفاده از تابع type با اتریبیوتی به نام value و مقدار 42 تعریف شده است.
آشنایی با تابع isinstance
تابع isinstance در پایتون یک تابع پیشساخته است که بررسی میکند یک شیء یا آبجکت، نمونهای از یک کلاس مشخص یا یکی از زیرکلاسهای آن است یا نه. در مورد این تابع بیشتر بدانید: تفاوت type و isinstance
مثال واقعی از تابع type
در یک سناریوی فرضی، شما میخواهید چندین کلاس داده را به صورت پویا و با ساختاری مشخص تعریف کنید. در اینجا، تابع type به کمک شما میآید تا این کار را خودکار کنید:
def create_class(name, custom_members):
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
def __repr__(self):
return f"{name}({self.__dict__})"
class_members = {
"__init__": __init__,
"__repr__": __repr__,
}
class_members.update(custom_members)
return type(name, (), class_members)
از این به بعد میتوانید به سادگی تابع create_class را فراخوانی کنید تا کلاس دلخواه شما را بسازد:
>>> User = create_class("User", {"name": "", "age": 0, "email": ""})
>>> john = User(name="John", age=30, email="john@example.com")
>>> john.name
'John'
در اینجا، ابتدا یک کلاس سفارشی به نام User ساخته شده که ۳ اتریبیوت پایه دارد. در خط دوم، یک آبجکت مطابق با ساختار کلاس User با مقادیر مشخص برای اتریبیوتهای آن ساخته شده است.
این قابلیت در کتابخانهها یا فریمورکهایی که نیاز دارند کلاسها را به صورت لحظهای ایجاد کنند، بسیار کاربرد دارد.
پرسشهای متداول
-
تابع type در پایتون چه کاری انجام میدهد؟
الف) دریافت نوع یک آبجکت: وقتی با یک آرگومان فراخوانی شود، نوع یا کلاس آن آبجکت را برمیگرداند.
ب) ساخت پویای کلاس: وقتی با سه آرگومان فراخوانی شود، امکان ساخت کلاسهای جدید در زمان اجرا را فراهم میکند. این قابلیت پیشرفتهتر بوده و در متاپروگرامینگ کاربرد دارد. -
چطور میتوانم نوع یک متغیر را در پایتون بررسی کنم؟
با استفاده از تابع type یا isinstance میتوانید نوع یک متغیر را در پایتون بررسی کنید.
-
آیا تابع type با کلاسهای دلخواه هم کار میکند؟
بله، این تابع میتواند هم بر روی کلاسهای پیشساخته پایتون و هم بر روی کلاسهای دلخواه (کلاسهایی که توسط کاربر ساخته شدهاند) به کار گرفته شود.
-
آیا میتوانم با تابع type، یک کلاس به صورت پویا بسازم؟
بله، میتوانید از تابع type با سه آرگومان به صورت type(name, bases, dict) برای ساخت پویای یک کلاس جدید استفاده کنید. در اینجا name یک رشته است که نام کلاس را مشخص میکند، bases یک تاپل از کلاسهای والد است که کلاس جدید از آنها ارثبری میکند، و dict یک دیکشنری است که ویژگیها و متدهای کلاس را تعریف میکند. این قابلیت قدرتمند اغلب در فریمورکها، ORMها (نگاشت شیء-رابطهای) یا در مواردی که ساختار کلاس باید به صورت برنامهنویسانه تعریف شود، استفاده میشود.
-
تفاوت تابع type و isinstance در چیست؟
تفاوت اصلی این دو تابع در نحوه برخوردشان با وراثت است. type بررسی میکند که آیا آبجکت دقیقاً نمونهای از کلاس مدنظر شما هست یا نه و وراثت را در نظر نمیگیرد. یعنی اگر آبجکت نمونهای از یک زیرکلاس باشد، نتیجه False خواهد بود. در مقابل، تابع isinstance بررسی میکند که آیا آبجکت نمونهای از کلاس مدنظر شما یا هر یک از زیرکلاسهای آن است. این تابع وراثت را به درستی مدیریت میکند و برای بررسی نوع در منطق شرطی گزینه مناسبتری است.
جهت کسب اطلاعات بیشتر میتوانید به مستندات رسمی پایتون برای تابع type مراجعه کنید.