Class ها در پایتون

قبل از اینکه به مفهوم و نحوه پیاده سازی و توضیح کلاس در پایتون بپردازیم ابتدا بهتر است به صورت مختصر، تعریفی از خود کلاس در برنامه نویسی داشته باشیم تا بهتر بتوانیم مفهوم کلاس ها در زبان برنامه نویسی پایتون را درک کنیم.
کلاس در برنامه نویسی چیست؟
در برنامه نویسی، کلاس طرحی اولیه یا نمونه اولیه ای است که متغیرها و متدهایی (توابع) را تعریف می کند. درواقع می توان گفت که کلاس در برنامه نویسی قالبی برای ایجاد اشیاء است. همچنین کلاس ها وسیله ای برای ترکیب داده ها و توابع باهم فراهم می کنند. در بخش بعدی به مفهوم اینکه کلاس پایتون چیست پرداخته خواهد شد.
دوره پیشنهادی:
کلاس در پایتون چیست؟
ازآنجایی که پایتون نوعی زبان برنامه نویسی شی گرا (OOP) به حساب می آید، همه عناصر در آن نشان دهنده یک شی هستند. لیست ها، تاپلها، مجموعه ها، دیکشنری ها، توابع و غیره همگی نمونه هایی از اشیاء پایتون به حساب می آیند. درواقع می توان گفت که شی در پایتون موجودیتی از آیتم های داده و متدهایی است که رفتار آن آیتم ها را توصیف می کند.
در مقابل، کلاس پایتون یک الگو یا سازنده است که برای ایجاد اشیاء پایتون استفاده می شود. ما می توانیم آن را به عنوان یک دستور آشپزی در دنیای واقعی در نظر بگیریم که در آن تمام مواد و مقدار آن ها و کل فرآیند پخت وپز به صورت گام به گام شرح داده شده است. برای مثال، می توانیم دستور پخت کیک را با یک کلاس پایتون و کیکی که طبق آن دستور پخته شده است را با یک شی (به عنوان مثال، نمونه ای از آن کلاس) مقایسه کنیم. با استفاده از همان دستور (کلاس) می توانیم کیک های (اشیاء) زیادی تولید کنیم. این دقیقاً مقیاس ایجاد یک کلاس در پایتون است: برای تعریف عناصر داده و قوانینی که نحوه تعامل این عناصر و تغییر حالت آن ها را تعیین می کند و سپس از این نمونه اولیه برای ساخت اشیاء مختلف (نمونه های کلاس) به روشی از پیش تعریف شده استفاده به نام کلاس در پایتون استفاده می شود.
شما شرکت در آموزش پایتون در اصفهان به راحتی می توانید دست به تولید نرم افزارهایی در حوزه آماری و شرکتی یا مدیریتی بزنید
a = 5
b = ‘Hello World’
c = [1, 2, 3]
for var in [a, b, c]:
print(type(var)==var.__class__)
خروجی قطعه کد بالا به صورت زیر است:
True
True
True
با این حال، چندین کلاس داخلی (انواع داده) در پایتون وجود دارد: عدد صحیح، شناور، رشته، بولی، لیست، محدوده، تاپل، مجموعه، دیکشنری و برخی دیگر که به ندرت استفاده از آن ها استفاده می شوند: در زیر چند تا از این نوع داده ها آورده شده اند.
a = 5.2
b = ‘Hello World’
c = [1, 2, 3]
d = False
e = range(4)
f = (1, 2, 3)
g = complex(1, -1)
for var in [a, b, c, d, e, f, g]:
print(var.__class__)
خروجی این کد چیزی شبیه این است:
توابع داخلی و تعریف شده توسط کاربر کلاس و همچنین انواع خاص خود را دارند:
def my_func():
pass
print(my_func.__class__
خروجی به صورت زیر است:
وقتی از کتابخانه های اضافی پایتون مانند پانداها یا نامپای استفاده می کنیم، می توانیم اشیایی از کلاس ها/انواع مربوط به آن کتابخانه ها ایجاد کنیم که قطعه کد زیر این مفهوم را به خوبی بیان می کند.
import pandas as pd
import numpy as np
s = pd.Series({‘a’: 1, ‘b’: 2})
df = pd.DataFrame(s)
arr = np.array([1, 2, 3])
print(s.__class__)
print(df.__class__)
print(arr.__class__)
خروجی این قطعه کد به صورت زیر است:
تعریف کلاس در پایتون
class MyClass:
pass
class MyClass:
”’This is a new class”’
pass
class MyClass:
”’This is a new class”’
pass
خروجی به صورت زیر است:
با این حال، اجازه دهید به موضوع اصلی برگردیم. به طور کلی، هنگام تعریف یک کلاس جدید، یک شی کلاس جدید نیز ایجاد خواهد شد که شامل تمام ویژگی ها (متغیرها و متدها) مربوط به آن کلاس است. همچنین در آن برخی از صفات بامعنای خاص نیز وجود دارد، آن هایی که با دو آندرلاین شروع و پایان می یابند و مربوط به همه کلاس ها هستند. به عنوان مثال، ویژگی doc__ رشته docstring آن کلاس یا None را برمی گرداند، اگر هیچ docstring اضافه نشده باشد.
دوره پیشنهادی:
مثالی از نحوه ایجاد کلاس در پایتون
class <<>classname>:
<<>statement1>
<<>statement2>
.
.
<<>statementn>
<<>/statementn><<>/statement2><<>/statement1><<>/classname>
- ویژگی های کلاس
- سازنده
- ویژگی های نمونه
- خواص
- متدهای کلاس
class Student:
pass
کلاس های والد و فرزند در پایتون
در پایتون از کلاس های والد و فرزند برای ایجاد سلسله مراتب کلاس استفاده می شود که راهی برای سازمان دهی کلاس ها در یک ساختار سلسله مراتبی است. کلاس والد کلاسی به حساب می آید که توسط کلاس دیگری به ارث می رسد که به عنوان کلاس فرزند شناخته می شود. کلاس فرزند به تمام ویژگی ها و متدهای کلاس والد دسترسی دارد و همچنین می تواند ویژگی ها و متدهای خود را اضافه کند.
ویژگی های کلاس
ویژگی های کلاس متغیرهایی هستند که مستقیماً در کلاس تعریف شده اند و توسط تمام اشیاء کلاس به اشتراک گذاشته می شوند. با استفاده از نام کلاس و همچنین با استفاده از اشیاء می توان به ویژگی های کلاس دسترسی داشت.
class Student:
schoolName = ‘XYZ School’
>>> Student.schoolName
‘XYZ School’
>>> std = Student()
>>> std.schoolName
‘XYZ School’
class TrafficLight:
”’This is a traffic light class”’
color = ‘green’
def action(self):
print(‘Go’)
print(TrafficLight.__doc__)
print(TrafficLight.__class__)
print(TrafficLight.color)
print(TrafficLight.action)
یکی از عوامل مهم در حرفه برنامه نویسی، انتخاب بهترین آموزشگاه پایتون در اصفهان است
خروجی به صورت زیر خواهد بود:
سازنده
در پایتون، هر زمان که یک شی جدید از یک کلاس نمونه سازی می شود، متد سازنده به طور خودکار فراخوانی خواهد شد، مانند سازنده های C# یا جاوا. هر سازنده در پایتون باید یک نام خاص __init__() و یک پارامتر خاص به نام self داشته باشد.
نکته: اولین پارامتر هر متد در یک کلاس باید self باشد که به شیء فراخوانی اشاره دارد. با این حال، کاربر می تواند هر نامی را برای پارامتر اول انتخاب کند، نه لزوماً self. مثال زیر یک سازنده را تعریف می کند.
اکنون، هر زمان که یک شی از کلاس Student ایجاد شود، مطابق شکل زیر، متد سازنده __init__() (__init__ self) فراخوانی می شود.
s1 = Student()
Constructor invoked
s2 = Student()
Constructor invoked
سازنده در پایتون برای تعریف ویژگی های یک نمونه و تخصیص مقادیر به آن ها استفاده می شود و اهمیت بسیار زیادی دارد.
نکته: __init__ یک متد خاص در کلاس های پایتون است. به عنوان سازنده شناخته می شود و زمانی که یک شی از یک کلاس ایجاد شد، به طور خودکار فراخوانی می شود. می توان از آن برای تنظیم مقادیر متغیرهای نمونه در زمان ایجاد شی استفاده کرد.
ویژگی های نمونه
ویژگی های نمونه، خواص یا ویژگی هایی هستند که به یک نمونه از یک کلاس پایتون متصل می شوند. ویژگی های نمونه در سازنده تعریف خواهند شد. مثال زیر ویژگی های نمونه نام و سن را در سازنده تعریف می کند.
همان طور که در زیر نشان داده شده است، می توان با استفاده از علامت نقطه: [نام نمونه]، به یک ویژگی نمونه دسترسی داشت.
std = Student()
std.name
”
std.age
0
همان طور که در زیر نشان داده شده است می توانی مقدار ویژگی ها را با استفاده از علامت نقطه تنظیم کرد.
اکنون می توان مقادیر را در حین ایجاد یک نمونه مشخص کرد. مثال زیر این موضوع را نشان می دهد.
std = Student(‘Bill’,25)
std.name
‘Bill’
std.age
25
نکته: لازم نیست مقدار پارامتر self مشخص شود. به صورت داخلی و به طور خودکار این پارامتر در پایتون اختصاص داده خواهد شد.
همچنین می توان مقادیر پیش فرض را برای ویژگی های نمونه تنظیم کرد. کد زیر مقادیر پیش فرض پارامترهای سازنده را تعیین می کند؛ بنابراین، اگر مقادیر در هنگام ایجاد یک شی ارائه نشده باشند، مقادیر بعدی به آن ها اختصاص داده می شود.
class Student:
def __init__(self, name=Guest, age=25)
self.name=name
self.age=age
اکنون می توان مانند کد زیر یک شی با مقادیر پیش فرض ایجاد کرد.
std = Student()
std.name
‘Guest’
std.age
25
ویژگی های کلاس در پایتون
متد property() متدهای get، set و delete را به عنوان آرگومان می گیرد و یک شی از کلاس ویژگی را برمی گرداند. مثال زیر نحوه ایجاد یک ویژگی در پایتون را با استفاده از تابع ()property نشان می دهد.
class Student:
def __init__(self):
self.__name=”
def setname(self, name):
print(‘setname() called’)
self.__name=name
def getname(self):
print(‘getname() called’)
return self.__name
name=property(getname, setname)
std = Student()
std.name=Steve
setname() called
std.name
getname() called
‘Steve’
متدهای کلاس در پایتون
کاربر می تواند هر تعداد متد را که می خواهد در یک کلاس پایتون با استفاده از کلمه کلیدی def تعریف کند. هر متد باید اولین پارامتر خود را داشته باشد که به طور کلی به عنوان پارامتر پیش فرض self نامیده می شود که به نمونه فراخوانی اشاره دارد.
std = Student()
std.displayInfo()
‘Student Information’
خروجی به صورت زیر است:
این متد می تواند با استفاده از پارامتر self به ویژگی های نمونه دسترسی پیدا کند.
اکنون می توان متد را مانند قطعه کد زیر فراخوانی کرد.
std = Student(‘Steve’, 25)
std.displayInfo()
Student Name: Steve , Age: 25
اعلان اشیاء کلاس در پایتون
کاربر می تواند یک شی کلاس را به متغیری اختصاص دهد و یک شی (نمونه) جدید از آن کلاس در پایتون ایجاد کند. این فرآیند را نمونه سازی نام دارد. شیء کلاسی که به متغیری اختصاص داده می شود، کپی آن کلاس با مقادیر واقعی است که این شیء را از سایر شیءهای همان کلاس متمایز می کند.
یک شی کلاس دارای ویژگی های زیر است:
- state – داده ها (متغیرهای) شی
- رفتار – متد شی
- هویت – نام منحصربه فرد شی
class TrafficLight:
”’This is a traffic light class”’
color = ‘green’
def action(self):
print(‘Go’)
traffic = TrafficLight()
print(traffic.__doc__)
print(traffic.__class__)
print(traffic.color)
print(traffic.action)
print(traffic.action())
خروجی این مثال به صورت زیر است:
obj.method(arg1, arg2, …, argN) ➡️ MyClass.method(obj, arg1, arg2, …, argN)
بنابراین، هر متد کلاس در پایتون باید این پارامتر اول اضافی را داشته باشد که خود شیء را نشان می دهد، حتی اگر هیچ پارامتر دیگری نداشته باشد. بر اساس قرارداد نام گذاری پایتون، توصیه می شود که این پارامتر self نام گذاری شود و همان طور که گفته شد اجباری برای این نام وجود ندارد.
دوره پیشنهادی: آموزش صفر تا ۱۰۰ پایتون مکتبخانه
اضافه کردن متد جدید به کلاس در پایتون
class TrafficLight:
”’This is an updated traffic light class”’
def __init__(self, color):
self.color = color
def action(self):
if self.color==’red’:
print(‘Stop & wait’)
elif self.color==’yellow’:
print(‘Prepare to stop’)
elif self.color==’green’:
print(‘Go’)
else:
print(‘Stop drinking ‘)
yellow = TrafficLight(‘yellow’)
yellow.action()
مطلب پیشنهادی:
ایجاد و حذف ویژگی های شی در پایتون
می توان پس از نمونه سازی یک شیء کلاس در پایتون، یک ویژگی جدید به آن اضافه کرد: مثال زیر این موضوع را نشان می دهد:
green = TrafficLight(‘green’)
yellow = TrafficLight(‘yellow’)
green.next_color = ‘red’
print(green.next_color)
print(yellow.next_color)
خروجی به صورت زیر است:
print(yellow.color)
del yellow.color
print(yellow.color)
yellow
—————————————————————————
AttributeError Traceback (most recent call last)
~AppDataLocalTemp/ipykernel_3860/1130729614.py in <<>module>
1 print(yellow.color)
2 del yellow.color
—-> 3 print(yellow.color)
AttributeError: ‘TrafficLight’ object has no attribute ‘color’
<<>/module>
خروجی به صورت زیر است:
متغیرهای کلاس و شی در پایتون
تفاوت بین متغیرهای کلاس و شی در جایی است که مقادیر آن ها در یک تعریف کلاس تخصیص داده شده است که محدوده متغیرها را نیز تعیین می کند.
- متغیرهای کلاس در پایتون: در اعلان کلاس تخصیص داده شده اما خارج از هر تعریف متدی (از جمله سازنده کلاس). آن ها به تمام نمونه های شی آن کلاس مرتبط هستند.
- متغیرهای شی: در یک متد کلاس یا تعریف سازنده تخصیص داده می شود. آن ها برای هر نمونه شی از آن کلاس در پایتون منحصربه فرد هستند.
خروجی مانند تصویر زیر است:
مطلب پیشنهادی:
نتیجه گیری
به طور خلاصه، در این مطلب آموزشی از مکتب خونه ما جنبه های بسیاری از ایجاد و استفاده از کلاس های پایتون را مورد بحث قرار داده ایم که از جمله می توان به موارد زیر اشاره داشت: اگر بخواهیم با پایتون برنامه نویسی شی گرا انجام دهیم، حتماً باید نحوه ایجاد کلاس در پایتون را یاد بگیریم. در این آموزش با نحوه تعریف کلاس، متدها و ویژگی های آن در python آشنا شده و با مثال آن را بررسی می کنیم.
برای مثال، هر کدام از ما یک نمونه (شی) از کلاس انسان هستیم. هر کدام ویژگی های منحصر به خودمان را داریم. از رنگ پوست و ملیت گرفته تا قد، وزن و سن. همچنین همگی می توانیم کارهایی را انجام دهیم، مثلاً راه برویم، چیزی بخوریم یا حرف بزنیم.
بر مبنای همین مثال، در ادامه ی آموزش یک کلاس ساده از انسان را در پایتون پیاده سازی می کنیم.
تعریف کلاس در پایتون
فرض کنید می خواهیم کلاسی به نام Person ایجاد کنیم. این کلاس نشان دهنده موجودیت افراد در سیستم ما است.
مشابه هر ساختار دیگری در ، دندانه گذاری (یا فرورفتگی) کدها در ساختار کلاس دارای اهمیت است.
class Person:
# class body here…
برای تعریف توضیحات کلاس، توضیحات توصیف کننده را در خط اول بدنه به شکل یک رشته متنی می نویسیم؛ مثل کلاس زیر:
class Person:
represent person identity
# class body here ….
ویژگی کلاس در پایتون
ویژگی های یک کلاس (property) وضعیت و مقادیری مرتبط با نمونه های ایجاد شده از آن کلاس را نگهداری می کند. در حقیقت این ویژگی ها متغیرهایی هستند که اطلاعات مورد نیاز را در آن ها قرار می دهیم.
برای اینکه یک ویژگی کلاس در پایتون را از همان ابتدا تعریف کنیم، مشابه عمل می کنیم. به این صورت که در بدنه کلاس، نام متغیر (ویژگی) را نوشته و مقداردهی می کنیم.
class Person:
name = None
nationality = iranian
score = 100
# some codes
تعریف متدهای کلاس
متدهای کلاس در پایتون همان رفتارهای یک شی از کلاس است. برای تعریف متدها دقیقاً مشابه عمل می کنیم. یعنی پس از کلمه کلیدی def نام متد مورد نظر را نوشته و در صورت نیاز، پارامترهای ورودی آن را مشخص می کنیم.
class Person:
name = None
score = 100
def say_hello(self):
print( Hello! )
دقت کنید که برای تعریف متدها در کلاس های پایتون، می بایست حداقل یک آرگومان ورودی که معمولاً به نام self تعریف می شود برای آن در نظر گرفت.
متغیر self در پایتون
برای اینکه در متدهای کلاس به ویژگی های همان شئ دسترسی داشته باشیم، از self استفاده می کنیم. این مقدار به همان شئ ما اشاره کرده و می توانیم مشابه یک شئ با آن رفتار کنیم.
class Person:
name = None
score = 100
def set_name(self, name):
self.name = name
class Person:
name = None
score = 100
def set_name(self, name):
if name == None:
self.name = name
else:
print(You Cann’t Change name Attribute!)
استفاده از کلاس در پایتون
حال که یک کلاس ساده ساختیم، می توانیم از آن شئ (object) ایجاد کنیم. وقتی یک شی ساخته می شود، دارای id منحصر به فرد در حافظه کامپیوتر خواهد شد. بنابراین همه اشیاء از یکدیگر متمایز بوده و ویژگی هایشان با یکدیگر متفاوت است.
ساخت شی از کلاس
برای ساخت شئ از کلاس در پایتون فقط کافی است نام کلاس را به صورت یک تابع بنویسیم. مثلاً برای ساخت یک شی جدید از کلاس Person به شکل زیر عمل می کنیم:
user = Person()
با این کار، مقداری در متغیر user ذخیره می شود که به کمک آن می توانیم به متدها و ویژگی های شئ دسترسی داشته باشیم. اگر type() این شئ را بررسی کنیم، نتیجه ای مشابه تصویر زیر به ما برگردانده می شود:
با گذاشتن نقطه (.) بعد از نام شئ، می توانیم متدها و ویژگی های آن را فراخوانی کرده و استفاده کنیم. در قطعه کدهای زیر، پس از ساخت یک نمونه از کلاس Person، نام آن را تعریف کرده و سپس مقدار ویژگی score او را چاپ کرده ام. ()
user = Person()
user.set_name(Omid)
print( user.score )
سازنده __init__ در پایتون
زمانی که می خواهیم یک شئ از کلاس در پایتون ایجاد کنیم، یک متد فراخوانی می شود. به این متد constructor یا سازنده گفته می شود. وقتی Person() را فراخوانی می کنیم، در حقیقت داریم متد سازنده کلاس Person را اجرا می کنیم.
اگر برای کلاسی متد سازنده تعریف نشود، مشکلی وجود ندارد. اما معمولاً از این متد برای کارهای اولیه ساخت شی از کلاس (مثل مقداردهی اولیه ویژگی ها) استفاده می شود.
برای تعریف متد سازنده کلاس در پایتون به شکل زیر عمل می کنیم. سازنده زیر، ساده ترین سازنده کلاس است.
ما می توانیم برای متد __init__ آرگومان های ورودی تعریف کنیم. مثلاً در کلاس زیر، نام و نام خانوادگی کاربر را در هنگام ساخته شدن object تنظیم می کنم.
class Person:
name = None
score = 100
def __init__(self, name, family):
self.name = name
self.family = family
def say_hello(self):
print(Hello, self.name)
user = Person(Omid, Rajaei)
user.say_hello()
در این آموزش به نحوه تعریف کلاس در پایتون پرداختیم. اگر مایلید مثال های بیشتری از کلاس های پایتون ببینید، به مراجعه کنید.
پیشنهاد می کنم همین الآن چند کلاس برای خود نوشته و چند ویژگی و متد برای آن ها تعریف کنید تا نحوه تعریف و کار با کلاس ها را کاملاً به خاطر بسپارید.
این آموزش برای همیشه رایگانه! می تونید با اشتراک گذاری لینک اییکی از مهم ترین و پرکاربردترین مفاهیم در محسوب می شود. کلاس بستری را فراهم می کند تا داده ها و توابع در کنار یکدیگر قرار بگیرند که همین امر در بهتر شدن کدنویسی به صورت سازمان یافته نقش به سزایی دارد. کلاس در به عنوان یکی از اساسی ترین مفاهیم این زبان تلقی می شود، زیرا تمامی ماهیت های این زبان برنامه نویسی بر پایه مفهوم کلاس بنا شده اند. همچنین، زبان پایتون جزء زبان های به شمار می رود که از کلاس، به عنوان مهم ترین عنصر ، به منظور پیاده سازی اصول آن استفاده می کند.
در مطلب حاضر، سعی بر این است تا آموزش جامعی از مفهوم کلاس و اجزای اصلی آن، نحوه پیاده سازی و استفاده از آن در زبان پایتون ارائه شود. به علاوه، در این مقاله، با ارائه مثال های کاربردی از زبان برنامه نویسی پایتون به نحوه پیاده سازی با استفاده از کلاس پرداخته می شود.
مفهوم شی در زبان برنامه نویسی پایتون چیست ؟
زبان برنامه نویسی پایتون به عنوان یکی از زبان های برنامه نویسی شی گرا محسوب می شود. یکی از اجزای اصلی مفهوم شی گرایی، «شی» (Object) است که ویژگی ها و رفتارهای داده ها را مشخص می کند. تمامی اجزای زبان پایتون نظیر ، ، ، ، و سایر اجزاء در قالب شی در اختیار کاربران قرار می گیرند. به عبارتی، با استفاده از دستور type() می توان شی بودن این اجزاء را در پایتون بررسی کرد.
حتی در پایتون نیز از نوع و ماهیت شی هستند. به عنوان مثال، یکی از انواع داده ها در زبان برنامه نویسی پایتون، است. متغیری که در این زبان از نوع عددی تعریف شده باشد، عضو یا شیئی از کلاس Integer محسوب می شود.
مفهوم کلاس در زبان پایتون چیست ؟
کلاس در برنامه نویسی، طرح اولیه ای از یک شی است و با تعریف اشیای مختلف از یک کلاس می توان موجودیت های (اشیای) مختلفی را ایجاد کرد که در تعداد و نوع مشخصه ها با یکدیگر اشتراک دارند، اما مقادیر هر یک از مشخصه های اشیاء با یکدیگر متفاوت هستند.
در تصویر زیر، مثال ملموسی از مفهوم کلاس و شی در دنیای واقعی مشاهده می شود. در این مثال، کلاسی با نام کلاس مشتری وجود دارد که شامل ویژگی های مشتریان و عملکرد (متد) آن ها است. ایمیل و شماره تلفن مشتریان به عنوان ویژگی ها و نحوه سفارش و دلیل مرجوعی کالا به عنوان متدهای کلاس تعیین شده اند.
هر یک از مشتریان نیز به عنوان اشیای کلاس مشتری تلقی می شوند که دارای ویژگی ها و متدهای کلاس با مقادیر متفاوت هستند. به عبارتی، تمامی مشتریان دارای ویژگی های آدرس ایمیل و شماره تلفن هستند که مقدارشان برای هر یک از مشتریان، منحصربفرد است. به علاوه، تمامی مشتریان دارای متدهای نحوه سفارش کالا و دلیل مرجوعی محصول هستند که می توانند با مقادیر مختلفی مقداردهی شوند. به عنوان مثال، دلیل مرجوعی مشتری اول می تواند خرابی محصول باشد، در حالی که مشتری سوم به دلیل گذشتن تاریخ انقضای محصول، تصمیم به مرجوع کردن کالا گرفته است.
زبان برنامه نویسی پایتون به عنوان یکی از زبان های برنامه نویسی شی گرا، بر پایه مفهوم شی و کلاس طراحی شده است. به عبارتی، با تعریف هر ماهیتی در این زبان نظیر انواع ساختار داده، شی جدیدی از کلاس های آن ها ساخته می شوند که هر کدام دارای مشخصه های خاص خود هستند. به عنوان مثال، با تعریف لیست جدیدی در پایتون، شی جدیدی از کلاس لیست ساخته می شود که این شی دارای مشخصه های منحصربفردی برای عملیات مختلف نظیر درج آیتم در لیست، حذف آیتم از لیست، اندازه لیست و سایر موارد است. بدین تریب، کلاس در پایتون به عنوان یکی از مهم ترین ارکان این زبان محسوب می شود. در ادامه، مزایای استفاده از کلاس در برنامه نویسی پایتون ارائه شده است.
مزایای استفاده از کلاس در برنامه نویسی پایتون چیست ؟
کلاس یکی از مهم ترین مفاهیم در برنامه نویسی محسوب می شود که کاربرد زیادی در توسعه پروژه های نرم افزاری دارد. به دلیل مزیت های مهم کلاس، برنامه نویسان سعی دارند از آن به طور مکرر در برنامه های خود استفاده کنند. در ادامه، به برخی از اصلی ترین مزایای استفاده از کلاس در برنامه نویسی اشاره می شود:
- در زبان پایتون، نگهداری مشخصه ها و متدهای اشیا در داخل کلاس باعث می شود سازمان دهی کدها بهتر انجام شود.
- کلاس به عنوان یکی از اجزای اصلی شی گرایی محسوب می شود و با استفاده از آن می توان به پیاده سازی اصول شی گرایی نظیر کپسوله سازی و ارث بری پرداخت. از آنجا که پایتون به عنوان یکی از زبان های برنامه نویسی شی گرا به حساب می آید، از کلاس به منظور اجرایی کرد اصول شی گرایی پشتیبانی می کند.
- با استفاده از کلاس در پایتون می توان از قطعه کدهای نوشته شده به دفعات مختلف در پروژه های متفاوت استفاده کرد که همین امر به صرفه جویی در هزینه های زمانی برای توسعه پروژه های کامپیوتری کمک شایانی می کند.
- با استفاده از کلاس در پایتون می توان توابع مرتبط به هم را درون یک کلاس نوشت که این قابلیت در تمیز نوشتن کدهای برنامه نقش بسزایی دارد.
در ادامه مقاله حاضر، با ارائه مثال کاربردی به نحوه تعریف کلاس در پایتون و شیوه استفاده از آن پرداخته می شود.
نحوه ساخت کلاس در زبان پایتون چگونه است ؟
class IntellipaatClass:
Class statements and methods here’
با اعلان کلاس جدید، به طور خودکار، شیئی همنام با کلاس ایجاد می شود که می توان با استفاده از آن، به ویژگی ها و متدهای کلاس دسترسی داشت. در مثال زیر، نحوه استفاده از شی هم نام با کلاس به منظور دسترسی به متغیر (ویژگی) و تابع (متد) درون کلاس ملاحظه می شود. علامت نقطه ( . ) به منظور دسترسی به مشخصه های کلاس توسط شی کاربرد دارد.
#3
class IntellipaatClass:
a = 5
def function1():
print(‘Welcome to Intellipaat’)
#accessing attributes using the class object of same name
IntellipaatClass.function1()
print(IntellipaatClass.a)
خروجی قطعه کد فوق در ادامه ملاحظه می شود:
Welcome to Intellipaat
5
نحوه تعریف کلاس در زبان پایتون با استفاده از تابع Type()
- آرگومان name : نام کلاس جدید را مشخص می کند. این نام توسط ویژگی __name__ کلاس، قابل دسترس است.
- آرگومان bases : تاپلی از کلاس های والد کلاس جدید را مشخص می کند.
- آرگومان dct : دیکشنری ای از متدها و ویژگی های کلاس جدید را معین می کند.
در قطعه کد زیر، مثالی از نحوه کاربرد تابع type() برای ساخت کلاس در پایتون ارائه شده است.
def test_method(self):
print(This is Test class method!)
# creating a base class
class Base:
def myfun(self):
print(This is inherited method!)
# Creating Test class dynamically using
# type() method directly
Test = type(‘Test’, (Base, ), dict(x=atul, my_method=test_method))
# Print type of Test
print(Type of Test class: , type(Test))
# Creating instance of Test class
test_obj = Test()
print(Type of test_obj: , type(test_obj))
# calling inherited method
test_obj.myfun()
# calling Test class method
test_obj.my_method()
# printing variable
print(test_obj.x)
Type of Test class:
Type of test_obj:
This is inherited method!
This is Test class method!
atul
نحوه استفاده از کلاس در زبان پایتون چگونه است ؟
در بخش قبل ملاحظه شد که با ایجاد کلاس در پایتون، به طور خودکار شی هم نامی با کلاس ساخته می شود و از آن می توان به منظور دسترسی به متغیرها و توابع درون کلاس استفاده کرد.
class IntellipaatClass:
a = 5
def function1(self):
print(‘Welcome to Intellipaat’)#creating a new object named object1 using class object
object1 = IntellipaatClass()
object1.function1()
خروجی قطعه کد فوق به صورت زیر است:
Welcome to Intellipaat
انواع ویژگی های کلاس در زبان برنامه نویسی پایتون چیست ؟
- ویژگی هایی که توسط برنامه نویس تعریف می شوند:
- «متغیرهای کلاس» (Class Variables)
- «متغیرهای نمونه» (Instance Variables)
- ویژگی های توکار پایتون
در ادامه مطلب حاضر، به شرح هر یک از اجزاء و قابلیت های کلاس در پایتون به همراه مثال پرداخته می شود.
متغیرهای نمونه و متغیرهای کلاس
در کلاس پایتون می توان دو نوع متغیر برای ذخیره سازی داده ها تعریف کرد. این دو نوع متغیر در ادامه فهرست شده اند:
- «متغیرهای کلاس» (Class Variables): متغیرهایی هستند که پس از اعلان کلاس تعریف می شوند. این متغیرها خارج از توابع (متدها) و در داخل کلاس قرار گرفته اند. مقدار این نوع متغیرها برای تمامی اشیای ساخته شده از یک کلاس واحد، یکسان است. مقادیر متغیرها را صرفاً می توان با استفاده از «متدهای کلاس» (Class Methods) تغییر داد. در بخش «انواع متدهای کلاس در پایتون» در مطلب حاضر، به توضیح متدهای کلاس پرداخته شده است.
- «متغیرهای نمونه» (Instance Variables): متغیرهایی هستند که درون توابع (متدها) و «سازنده ها» (Constructors) تعریف می شوند. مقادیر این متغیرها برای هر یک از اشیای ساخته شده از یک کلاس مشابه، می توانند متفاوت باشند. به عبارتی، متغیرهای نمونه، همان ویژگی های کلاس محسوب می شوند و توسط نام شی یا پارامتر self می توان به آن ها دسترسی داشت. در بخش «انواع متدهای کلاس در پایتون» در مطلب حاضر، به توضیح پارامتر self پرداخته شده است.
در قطعه کد زیر، مثالی از متغیرهای کلاس و متغیرهای نمونه ملاحظه می شود.
class TrafficLight:
”’This is an updated traffic light class”’
# Class variable
traffic_light_address = ‘NYC_Cranberry_Hicks’
def __init__(self, color):
# Instance variable assigned inside the class constructor
self.color = color
def action(self):
if self.color==’red’:
# Instance variable assigned inside a class method
self.next_color = ‘yellow’
print(‘Stop & wait’)
elif self.color==’yellow’:
self.next_color = ‘green’
print(‘Prepare to stop’)
elif self.color==’green’:
self.next_color = ‘red’
print(‘Go’)
else:
self.next_color = ‘Brandy’
print(‘Stop drinking ‘)
# Creating class objects
for c in [‘red’, ‘yellow’, ‘green’, ‘fuchsia’]:
c = TrafficLight(c)
print(c.traffic_light_address)
print(c.color)
c.action()
print(c.next_color)
print(‘n’)
NYC_Cranberry_Hicks
red
Stop & wait
yellow
NYC_Cranberry_Hicks
yellow
Prepare to stop
green
NYC_Cranberry_Hicks
green
Go
red
NYC_Cranberry_Hicks
fuchsia
Stop drinking
Brandy
ویژگی های توکار کلاس در زبان پایتون چیست ؟
کلاس های زبان پایتون علاوه بر ویژگی هایی که توسط برنامه نویس ساخته می شوند، دارای ویژگی های توکار (پیش ساخته | آماده) نیز هستند که اطلاعاتی را درباره کلاس در بر می گیرند. به ویژگی های توکار کلاس نیز می توان با استفاده از علامت نقطه (.) دسترسی داشت که پس از نام شی درج می شود. در ادامه، فهرستی از ویژگی های توکار در کلاس پایتون ارائه شده است.
- ویژگی __dict__
- ویژگی __doc__
- ویژگی __name__
- ویژگی __module__
- ویژگی __bases__
در بخش های بعدی مطلب حاضر، به توضیح کاربرد هر یک از ویژگی های توکار ذکر شده ی بالا به همراه مثال پرداخته می شود.
ویژگی __dict__ شی در پایتون
از ویژگی __dict__ به منظور نمایش تمامی ویژگی های کلاس به همراه مقادیر آن ها در قالب دیکشنری پایتون استفاده می شود. هر شی در پایتون دارای ویژگی توکار __dict__ است که با استفاده از علامت نقطه ( . ) می توان به آن دسترسی داشت. در قطعه کد زیر، مثالی از نحوه استفاده از ویژگی __dict__ ملاحظه می شود.
class AnimalClass:
def __init__(self,identity,age):
self.identity = identity
self.age = age
def feature(self):
if self.age == 10:
return True
else:
return False
ac = AnimalClass(‘Lion’,’10’)
print(ac.__dict__)
{‘identity’: ‘Lion’, ‘age’: ’10’}
ویژگی __doc__ شی در پایتون
# class
class Awesome:
‘This is a sample class called Awesome.’
def __init__(self):
print(Hello from __init__ method.)
# class built-in attribute
print(Awesome.__doc__)
با اجرای قطعه کد فوق، خروجی به صورت زیر است:
This is a sample class called Awesome.
# class
class Awesome:
‘This is a sample class called Awesome.’
def __init__(self):
print(Hello from __init__ method.)
# class built-in attribute
print(Awesome.__name__)
خروجی قطعه کد فوق، در ادامه ملاحظه می شود:
Awesome
ویژگی __module__ شی در پایتون
کلاس پایتون دارای ویژگی توکاری با نام __module__ است که نام ماژول کلاس را مشخص می کند. در قطعه کد زیر، مثالی از شیوه کاربرد ویژگی در پایتون ملاحظه می شود.
# class
class Awesome:
def __init__(self):
print(Hello from __init__ method.)
# class built-in attribute
print(Awesome.__module__)
خروجی قطعه کد فوق به صورت زیر است:
__main__
class A(object):
pass
class B(A):
pass
b = B()
print (b.__bases__)
(,)
تغییر ویژگی های کلاس و حذف شی در پایتون
object1.a = 25
همچنین، می توان شی ساخته شده را با استفاده از دستور del به صورت زیر حذف کرد.
del objectName
معرفی فیلم های آموزش پایتون
افرادی که علاقه مند هستند برنامه نویسی پایتون را یاد بگیرند، می توانند از مجموعه فیلم های جامع آموزشی پایتون سایت فرادرس استفاده کنند. سایت فرادرس پلتفرمی را برای آن دسته از افرادی فراهم کرده است که قصد یادگیری پایتون را به صورت حرفه ای دارند. دوره های گردآوری شده در مجموعه آموزش پایتون، شامل فیلم های آموزشی این زبان برنامه نویسی از سطح مقدماتی تا سطح پیشرفته است و مثال های کاربردی و پروژه های واقعی زبان پایتون را شامل می شوند. افراد می توانند از دوره های جامع پایتون در راستای تقویت مهارت برنامه نویسی خود استفاده کنند و از آموزش های پروژه محور فرادرس بهره بگیرند. در تصویر فوق تنها برخی از دوره های آموزشی مجموعه آموزش پایتون فرادرس مشاهده می شوند.
انواع متدهای کلاس در زبان پایتون چیست ؟
در زبان برنامه نویسی پایتون، کلاس ها می توانند شامل چهار نوع متد باشند که در ادامه فهرستی از آن ها فراهم شده است:
- «متد نمونه» (Instance Method)
- «متد کلاس» (Class Method)
- «متد ایستا» (Static Method)
- «متد خاص» (Special Method)
در ادامه مطلب حاضر به توضیح هر یک از انواع متدهای کلاس در زبان برنامه نویسی پایتون پرداخته می شود.
متد نمونه در کلاس های پایتون
class IntellipaatClass:
a = 5
def function1(self):
print(‘Welcome to Intellipaat’)
#creating a new object named object1 using class object
object1 = IntellipaatClass()
object1.function1()
متد نمونه صرفاً توسط شی کلاس مورد استفاده قرار می گیرد و اولین پارامتر این متد، پارامتر self است که به شی ساخته شده از کلاس اشاره دارد.
پارامتر self در کلاس پایتون چیست ؟
در مثال قبل ملاحظه می شود که در هنگام تعریف متد نمونه داخل کلاس، از آرگومانی با نام self استفاده شده با اینکه هیچ مقداری توسط شی object1 به تابع function1 منتقل نشده است.
باید خاطرنشان کرد در زبان برنامه نویسی پایتون، زمانی که یک تابع (متد) توسط شیئی صدا زده می شود، به طور خودکار شی به عنوان پارامتر، به آن تابع ارسال می شود. به عبارتی، دستور object1.function1() در زبان پایتون، معادل دستور object1.function1(object1) است و پایتون به طور خودکار تغییر زیر را بر روی توابع خوانده شده توسط اشیای کلاس اعمال می کند:
به همین خاطر، اولین آرگومان تابع درون کلاس، باید آرگومان self باشد که به شی کلاس اشاره دارد. می توان نام self را تغییر داد و از نام های دیگری به جای self استفاده کرد. اما به منظور فهم دقیق تر کدها و پایبند بودن به قراردادهای زبان پایتون، بهتر است که از همان کلمه self برای اشاره به شی استفاده شود.
متد کلاس در زبان پایتون
به منظور تغییر مقادیر متغیرهای کلاس، می توان از متد کلاس استفاده کرد که اعمال تغییر مقدار متغیرهای کلاس توسط این متد، بر روی تمامی اشیای ساخته شده از کلاس اثرگذار است.
تعریف متد کلاس با استفاده از دکوراتور
from datetime import date
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def calculate_age(cls, name, birth_year):
# calculate age an set it as a age
# return new object
return cls(name, date.today().year – birth_year)
def show(self):
print(self.name + ‘s age is: + str(self.age))
jessa = Student(‘Jessa’, 20)
jessa.show()
# create new object using the factory method
joy = Student.calculate_age(Joy, 1995)
joy.show()
Jessa’s age is: 20
John’s age is: 26
classmethod(function)
class School:
# class variable
name = ‘ABC School’
def school_name(cls):
print(‘School Name is :’, cls.name)
# create class method
School.school_name = classmethod(School.school_name)
# call class method
School.school_name()
School Name is : ABC School
پارامتر cls در کلاس پایتون چیست ؟
در بخش های قبلی اشاره شد که در متدهای نمونه کلاس، از پارامتر self به منظور دسترسی به متغیرهای نمونه استفاده می شود. این پارامتر در اعلان متد نمونه کلاس، به عنوان اولین پارامتر لحاظ می شود که به شی ساخته شده اشاره دارد. همانند پارامتر self ، پارامتر cls نیز اولین پارامتر متد کلاس در نظر گرفته می شود که با استفاده از آن می توان به متغیرهای کلاس دسترسی داشت. به عبارتی، این پارامتر به کلاس ساخته شده اشاره دارد.
می توان نام این پارامتر را تغییر داد اما به منظور خوانایی بیشتر برنامه، بهتر است از همان عبارت cls استفاده شود. خاطرنشان می شود که در متدهای کلاس صرفاً می توان از متغیرهای کلاس استفاده کرد و در این نوع متدها نمی توان به متغیرهای نمونه کلاس دسترسی داشت.
متد ایستا در کلاس پایتون
متدهای ایستا، متدهایی هستند که از آن ها برای تغییر مقادیر ویژگی های کلاس استفاده نمی شود. به عبارتی، این متدها به صورت خودکفا عمل می کنند و تنها با داده هایی سروکار دارند که توسط شی مستقیماً به آن ها ارسال می شوند؛ البته این نوع متدها می توانند بدون پارامتر ورودی نیز تعریف شوند. بدین ترتیب، در بین پارامترهای آن ها، پارامترهای self و cls دیده نمی شوند. برای دسترسی به این متدها می توان از نام کلاس یا شی استفاده کرد.
تعریف متد ایستا با استفاده از دکوراتور
class Employee(object):
def __init__(self, name, salary, project_name):
self.name = name
self.salary = salary
self.project_name = project_name
@staticmethod
def gather_requirement(project_name):
if project_name == ‘ABC Project’:
requirement = [‘task_1’, ‘task_2’, ‘task_3’]
else:
requirement = [‘task_1’]
return requirement
# instance method
def work(self):
# call static method from instance method
requirement = self.gather_requirement(self.project_name)
for task in requirement:
print(‘Completed’, task)
emp = Employee(‘Kelly’, 12000, ‘ABC Project’)
emp.work()
Completed task_1
Completed task_2
Completed task_3
staticmethod(function)
class Employee:
def sample(x):
print(‘Inside static method’, x)
# convert to static method
Employee.sample = staticmethod(Employee.sample)
# call static method
Employee.sample(10)
متدهای خاص کلاس در زبان پایتون
- تابع __init__
- تابع __str__
- تابع __len__
- تابع __eq__
در ادامه مطلب، به توضیح کاربرد هر یک از توابع توکار ذکر شده در فوق به همراه مثال پرداخته می شود.
تابع __init__ پایتون در کلاس
تابع __init__ در پایتون یکی از متدهای توکار کلاس محسوب می شود. در هنگام ساخت شی از یک کلاس، تابع __init__ به صورت خودکار صدا زده شده و دستورات داخل این تابع اجرا می شوند. این تابع به عنوان تابع «سازنده» (Constructor) در زبان برنامه نویسی پایتون به حساب می آید. معمولاً در داخل تابع __init__ متغیرهای کلاس، مقداردهی اولیه می شوند.
به منظور تعریف این تابع، می توان همانند سایر توابع، از کلمه کلیدی def استفاده کرد. همچنین، مانند دیگر توابع در پایتون، اولین پارامتر این متد، پارامتر self است که به شی ساخته شده اشاره دارد. سایر پارامترها نیز پس از پارامتر self قرار می گیرند. در مثال زیر، نمونه ای از نحوه کاربرد تابع __init__ در پایتون ملاحظه می شود.
class IntellipaatClass:
def __init__(self, course):
self.course = course
def display(self):
print(self.course)
object1 = IntellipaatClass(Python)
object1.display()
تابع __str__ در کلاس پایتون
class Book():
def __init__(self, name, writer, pages):
self.name = name
self.writer = writer
self.pages = pages
b = Book(Moby Dick, Herman Melville, 378)
print(b)
چنانچه قطعه کد فوق اجرا شود، خروجی به صورت زیر خواهد بود:
به عبارتی، زمانی که با دستور print(b) بخواهیم اطلاعاتی درباره شی b از کلاس Book را چاپ کنیم، در خروجی، اطلاعاتی درباره کلاس شی و محل ذخیره سازی شی در حافظه نشان داده می شوند. چنانچه لازم باشد با دستور print(b) ، اطلاعاتی راجع به کلاس یا پارامترهای آن در خروجی چاپ شوند، از تابع __str__ استفاده می شود. در مثال زیر، نحوه تعریف تابع __str__ به عنوان یکی دیگر از متدهای کلاس نشان داده شده است.
class Book():
def __init__(self, name, writer, pages):
self.name = name
self.writer = writer
self.pages = pages
def __str__(self):
return fThe title of the book is {self.name}
b = Book(Moby Dick, Herman Melville, 378)
print(b)
خروجی قطعه کد فوق در ادامه ملاحظه می شود:
The title of the book is Moby Dick
تابع __len__ در کلاس پایتون
از تابع __len__ به منظور بازگرداندن طول یکی از ویژگی های کلاس استفاده می شود. این متد معادل تابع len() است. چنانچه تابع __len__ در کلاس اعلان نشده باشد و کاربر این تابع را با استفاده از شی ساخته شده فراخوانی کند، خطایی در خروجی ظاهر می شود که گویای آن است چنین تابعی برای شی وجود ندارد. بدین ترتیب، تابع __len__ برخلاف تابع __str__ مقدار پیش فرضی در خروجی بازنمی گرداند.
class GFG:
def __init__(self, a):
self.a = a
def __len__(self):
return len(self.a)
obj = GFG(GeeksForGeeks)
print(len(obj))
خروجی قطعه کد فوق در ادامه ملاحظه می شود:
13
تابع __eq__ در کلاس پایتون
از تابع __eq__ در پایتون به منظور مقایسه دو نمونه از کلاس استفاده می شود. شروط مقایسه را می توان در داخل این متد مشخص کرد. در قطعه کد زیر، مثالی از نحوه کاربرد تابع __eq__ به منظور مقایسه دو شی از کلاس Book ملاحظه می شود.
class Book():
def __init__(self, name, writer, pages):
self.name = name
self.writer = writer
self.pages = pages
def __eq__(self, other):
return (self.name == other.name) & (self.writer == other.writer)
b = Book(Moby Dick, Herman Melville, 378)
a = Book(Moby Dick, Herman Melville, 410)
print(b == a)
انواع کلاس در زبان برنامه نویسی پایتون
در زبان برنامه نویسی پایتون انواع مختلفی از کلاس وجود دارند که هنگام نوشتن کلاس در پایتون باید نوع آن را مشخص کرد. در ادامه، انواع کلاس در این زبان فهرست شده اند:
- «کلاس انتزاعی» (Abstract Class)
- «کلاس عینی» (Concrete Class)
- «کلاس جزئی» (Partial Class)
در بخش های بعدی مطلب حاضر، به توضیح هر یک از انواع کلاس های پایتون پرداخته می شود.
کلاس انتزاعی در پایتون
به منظور استفاده از کلاس های انتزاعی، نمی توان به طور مستقیم از آن ها شی ساخت. به عبارتی، باید کلاس های فرزندی را ایجاد کرد که از کلاس های انتزاعی ارث بری می کنند و سپس با تعریف اشیای جدید از کلاس های فرزند، بتوان به متدهای انتزاعی کلاس های انتزاعی دسترسی داشت.
From abc import ABC, abstractmethod
Class AbstractClassName(ABC):
@abstract method
def abstract_method_name(self):
Pass
کلاس عینی در پایتون
کلاس عینی به کلاسی گفته می شود که تمامی متدهای آن دارای مجموعه ای از دستورات هستند. کلاس های عادی، نوعی کلاس عینی محسوب می شوند که می توان با تعریف شی از این کلا س ها، به مشخصه های کلاس دسترسی داشت. همچنین، کلاس های فرزندی که از کلاس های انتزاعی ارث بری می کنند، به عنوان کلاس های عینی تلقی می شوند.
کلاس جزئی در پایتون
کلاس جزئی در پایتون این امکان را به کاربران می دهد تا فایل یک کلاس را به چندین بخش مختلف تقسیم و این بخش ها را در فایل های مختلف به صورت جداگانه ذخیره کرد. در زمان کامپایل، به صورت خودکار تمامی فایل های مربوط به یک کلاس با یکدیگر ترکیب می شوند.
زمانی که برنامه نویسان مختلفی بر روی یک پروژه بزرگ نرم افزاری کار می کنند، نوشتن کلاس جزئی در پایتون این امکان را برای آن ها فراهم می کند تا بر روی اجزای یک کلاس واحد، کار کنند و متدهای آن را گسترس دهند. به عبارتی، با استفاده از کلاس های جزئی می توان بدون نیاز به ساخت مجدد کلاس، به تکمیل و توسعه اجزای کلاس در فایل های جداگانه پرداخت.
کلاس فرزندی که از کلاس جزئی ارث بری می کند، از تمام اجزای جداگانه آن ارث می برد. همچنین، اگر بخشی از کلاس جزئی دارای متد انتزاعی باشد، کل کلاس به عنوان کلاس انتزاعی محسوب می شود.
class Person:
pass
پیاده سازی شی گرایی با کلاس در زبان برنامه نویسی پایتون
همان طور که در بخش های قبلی گفته شد، پایتون به عنوان یکی از زبان های برنامه نویسی شی گرایی محسوب می شود. شی و کلاس اجزای مهم در شی گرایی هستند که از آن ها می توان برای پیاده سازی اصول شی گرایی استفاده کرد. این اصول عبارت اند از:
در ادامه، به نحوه استفاده از کلاس در پیاده سازی این چهار اصل شی گرایی پرداخته می شود.
ارث بری کلاس در پایتون
- «وراثت منفرد» (Single Inheritance)
- «وراثت چندگانه» (Multiple Inheritance)
- «وراثت چند سطحی» (Multi-Level Inheritance)
- «وراثت سلسله مراتبی» (Hierarchical Inheritance)
- «وراثت ترکیبی» (Hybrid Inheritance)
انواع وراثت در پایتون
در ادامه به توضیح هر یک از انواع وراثت کلاس ها در پایتون به همراه مثال پرداخته می شود.
وراثت منفرد در پایتون
در این نوع ارث بری، هر کلاس فرزند تنها دارای یک کلاس والد است و تمامی ویژگی ها و متدهای کلاس والد را به ارث می برد. در مثال زیر، شیوه ارث بری کلاس فرزند از کلاس والد ملاحظه می شود.
class Intellipaat:
def course(self):
print(Python tutorial)
class hello(Intellipaat):
def func(self):
print(Welcome to intellipaat)
ob1 = hello()
ob1.func()
ob1.course()
Welcome to Intellipaat
Python tutorial
وراثت چندگانه در پایتون
در این نوع ارث بری، هر کلاس فرزند می تواند دارای بیش از یک کلاس والد باشد. به عبارتی، کلاس فرزند تمامی مشخصه های مربوط به کلاس های والد خود را به ارث می برد. به منظور ایجاد وراثت چندگانه در پایتون، کافی است در زمان اعلان کلاس فرزند، نام تمامی کلاس های والد در داخل پرانتز نوشته شوند. در ادامه، مثالی از نحوه ایجاد وراثت چندگانه در پایتون ملاحظه می شود.
class BaseClass1():
def __init__(self):
print(Base class 1)
class BaseClass2():
def __init__(self):
print(Base class 2)
class derivedClass (BaseClass1, BaseClass2):
def __init__(self):
BaseClass1.__init__(self)
BaseClass2.__init__(self)
print(derived class)
def display_all(Self):
print(self.ob1, self.ob2)
ob = derivedClass()
Base class 1
Base Class 2
derived class
وراثت چندسطحی در پایتون
در این نوع وراثت، کلاس فرزند، از کلاس والدی ارث بری می کند که آن کلاس، به عنوان کلاس فرزند، از کلاس والد دیگری ارث می برد. به عبارتی، کلاس فرزند، از تمامی مشخصه های کلاس والد و کلاس والد والد خود ارث بری می کند. در مثال زیر، نمونه ای از ساخت وراثت چندسطحی در پایتون ملاحظه می شود.
class BaseClass():
def __init__(self):
print(Base class)
class childClass(BaseClass):
def __init__(self):
print(Child class)
class grandchildClass(childClass):
def __init__(self):
BaseClass.__init__(self)
childClass.__init__(self)
print(Grand child class)
ob1 = grandchildClass()
Base class
Child class
Grand child class
وراثت سلسله مراتبی در پایتون
در این نوع وراثت، ساختار ارث بری کلاس ها به صورت سلسله مراتبی است. به عبارتی، یک کلاس والد وجود دارد که تمامی کلاس های فرزند از آن ارث بری می کنند. در مثال زیر، نحوه ایجاد وراثت سلسله مراتبی در پایتون ملاحظه می شود.
# Python code to demonstrate example of
# hierarchical inheritance
class Details:
def __init__(self):
self.__id=
self.__name=
self.__gender=
def setData(self,id,name,gender):
self.__id=id
self.__name=name
self.__gender=gender
def showData(self):
print(Id: ,self.__id)
print(Name: , self.__name)
print(Gender: , self.__gender)
class Employee(Details): #Inheritance
def __init__(self):
self.__company=
self.__dept=
def setEmployee(self,id,name,gender,comp,dept):
self.setData(id,name,gender)
self.__company=comp
self.__dept=dept
def showEmployee(self):
self.showData()
print(Company: , self.__company)
print(Department: , self.__dept)
class Doctor(Details): #Inheritance
def __init__(self):
self.__hospital=
self.__dept=
def setEmployee(self,id,name,gender,hos,dept):
self.setData(id,name,gender)
self.__hospital=hos
self.__dept=dept
def showEmployee(self):
self.showData()
print(Hospital: , self.__hospital)
print(Department: , self.__dept)
def main():
print(Employee Object)
e=Employee()
e.setEmployee(1,Prem Sharma,Male,gmr,excavation)
e.showEmployee()
print(nDoctor Object)
d = Doctor()
d.setEmployee(1, pankaj, male, aiims, eyes)
d.showEmployee()
if __name__==__main__:
main()
Employee Object
Id: 1
Name: Prem Sharma
Gender: Male
Company: gmr
Department: excavation
Doctor Object
Id: 1
Name: pankaj
Gender: male
Hospital: aiims
Department: eyes
وراثت ترکیبی در زبان پایتون
این نوع وراثت، ترکیبی از روش های ارث بری مختلف است که در بخش های قبلی به آن ها اشاره شد. به عبارتی، می توان انواع روش های وراثت را با یکدیگر ترکیب کرد تا بتوان از حالات مختلف ارث بری بهره برد. به عنوان مثال، طبق تصویر زیر می توان وراثت سلسله مراتبی را با وراثت چندگانه ترکیب کرد.
مثالی از وراثت ترکیبی در پایتون
# Creating a Base class named University:
class University:
def __init__(self):
print(Contructor of the Base class)
# Initializing a class variable named univ to store university name:
self.univ = MIT
def display(self): # Method to print the University Name:
print(fThe University name is: {self.univ})
# 1st Derived or Child Class of University Class:
class Course(University):
def __init__(self):
# using super keyword to access members of the parent class having same name:
print(Constructor of the Child Class 1 of Class University)
University.__init__(self)
self.course = CSE
def display(self): # Method to print the Course Name:
# using super keyword to access display method defined in the parent class:
print(fThe Course name is: {self.course})
University.display(self)
# 2nd Derived or Child Class of University Class:
class Branch(University):
def __init__(self):
print(Constructor of the Child Class 2 of Class University)
self.branch = Data Science
def display(self): # Method to print the Branch Name:
print(fThe Branch name is: {self.branch})
# Derived or Child Class of Class Course and Branch:
class Student(Course, Branch):
def __init__(self):
print(Constructor of Child class of Course and Branch is called)
self.name = Tonny
Branch.__init__(self)
Course.__init__(self)
def display(self):
print(fThe Name of the student is: {self.name})
Branch.display(self)
Course.display(self)
# Object Instantiation:
ob = Student() # Object named ob of the class Student.
print()
ob.display() # Calling the display method of Student class.
خروجی قطعه کد فوق در ادامه ملاحظه می شود:
Constructor of Child class of Course and Branch is called
Constructor of the Child Class 2 of Class University
Constructor of the Child Class 1 of Class University
Contructor of the Base class
The Name of the student is: Tonny
The Branch name is: Data Science
The Course name is: CSE
The University name is: MIT
متد super کلاس در پایتون
از متد super() در پیاده سازی اصل وراثت و به منظور دسترسی به کلاس والد از داخل کلاس فرزند استفاده می شود. این متد پارامتر ورودی ورودی دریافت نمی کند و از تکرار نام کلاس والد جلوگیری می کند. پس از متد super() ، نام متدی از کلاس والد نوشته می شود که بنا است در کلاس فرزند استفاده شود. در قطعه کد زیر، مثالی از نحوه کاربرد این متد در پایتون ارائه شده است.
class Food():
def __init__(self, name):
self.name = nameا
class Cheese(Food):
def __init__(self, brand):
super().__init__()
self.brand = brand
در قطعه کد فوق، کلاس Food به عنوان کلاس والد برای کلاس Cheese محسوب می شود. با استفاده از دستور super().__init__() ، متد __init__ از کلاس Food فراخوانده شده است.
کپسوله سازی کلاس در زبان برنامه نویسی پایتون چیست ؟
کپسوله سازی یکی از چهار اصل شی گرایی محسوب می شود که می توان با استفاده از آن، دسترسی به مشخصه های کلاس را مدیریت کرد. به عبارتی، با به کارگیری این اصل می توان برای ویژگی ها و متدهای کلاس، محدودیت دسترسی ایجاد کرد تا نتوان آن ها را از خارج کلاس و حتی از طریق کلاس های فرزند، تغییر داد. همچنین، این اصل بستری را فراهم می کند تا تمامی مشخصه های اشیا درون کلاس در کنار هم قرار گیرند که همین امر باعث می شود نوشتن کدها به صورت سازمان یافته انجام شوند. در ادامه، به نحوه کپسوله سازی مشخصه های کلاس با ذکر مثال پرداخته می شود.
ساخت متد خصوصی در پایتون
مثالی از کپسوله سازی در دنیای واقعی
در برنامه نویسی، مستقیماً نمی توان به متدهای خصوصی از خارج کلاس یا از طریق کلاس های فرزند دسترسی داشت. به منظور تعریف متدهای خصوصی، پیش از نام متد، از علامت ( __ ) در پایتون استفاده می شود. البته باید خاطرنشان کرد که پایتون، مانع استفاده از متد خصوصی خارج از کلاس نمی شود. به عبارتی، چنانچه از این متدها در خارج از کلاس، استفاده شوند، خطای کامپایلر رخ نمی دهد و تعریف متدهای خصوصی در پایتون فقط به سایر برنامه نویسان نشان می دهد که این متدها برای داخل کلاس استفاده می شوند. به بیان دیگر، استفاده از علامت ( __ ) قراردادی برای تعیین نام متدهای خصوصی در میان برنامه نویسان است.
class Person:
def __init__(self, name):
self.name = name
def run(self):
self._warmup()
print({} is running.format(self.name))
def _warmup(self):
print({} is warming up.format(self.name))
jack = Person(‘Jack’)
jack.run()
با اجرای قطعه کد فوق، خروجی زیر حاصل می شود:
Jack is warming up
Jack is running
class Person:
def __init__(self, name):
self.name = name
def run(self):
self._warmup()
print({} is running.format(self.name))
def _warmup(self):
print({} is warming up.format(self.name))
jack._warmup()
خروجی قطعه کد فوق در ادامه ملاحظه می شود:
Jack is warming up
همان طور که ملاحظه شد، با فراخوانی متد خصوصی از خارج کلاس، هیچ خطای کامپایلری صورت نگرفت.
ساخت ویژگی خصوصی در پایتون
به منظور ساخت ویژگی های خصوصی کلاس در پایتون نیز همانند متدهای خصوصی، از علامت ( __ ) پیش از نام ویژگی استفاده می شود. البته باید خاطرنشان کرد که این علامت، قراردادی برای نشانه گذاری ویژگی های خصوصی در میان برنامه نویسان است و همانند متدهای خصوصی کلاس، می توان از خارج کلاس به ویژگی های خصوصی کلاس دسترسی داشت.
class Person:
def __init__(self, name, email):
self.name = name
self._email = email
mark = Person(Mark, mark@domain.com)
print(mark.name)
print(mark._email)
Mark
mark@domain.com
انتزاع در کلاس پایتون
انتزاع با کپسوله سازی رابطه بسیار نزدیکی دارد. از کپسوله سازی برای قرار دادن ویژگی ها و متدها در داخل کلاس استفاده می شود که با به کارگیری آن، تمامی اطلاعات مرتبط با یک شی در کنار هم قرار می گیرند. انتزاع مسئولیت کنترل دسترسی به ویژگی ها و متدهای داخل کلاس انتزاعی را برعهده دارد و اطلاعات آن را از کاربران پنهان می کند.
# Python program demonstrate
# abstract base class work
from abc import ABC, abstractmethod
class Car(ABC):
@abstractmethod
def mileage(self):
pass
class Tesla(Car):
def mileage(self):
print(The mileage is 30kmph)
class Suzuki(Car):
def mileage(self):
print(The mileage is 25kmph )
class Duster(Car):
def mileage(self):
print(The mileage is 24kmph )
class Renault(Car):
def mileage(self):
print(The mileage is 27kmph )
# Driver code
t= Tesla ()
t.mileage()
r = Renault()
r.mileage()
s = Suzuki()
s.mileage()
d = Duster()
d.mileage()
The mileage is 30kmph
The mileage is 27kmph
The mileage is 25kmph
The mileage is 24kmph
چندریختی در برنامه نویسی
«چندریختی | پلی مورفیسم» (Polymorphism) یکی از اصول مهم برنامه نویسی شی گرایی است و به وضعیتی اتلاق می شود که ماهیتی نظیر متد، یا شی در شرایط مختلف، رفتار متفاوتی داشته باشند.
به منظور درک بهتر این مفهوم می توان از مثال ملموسی در دنیای واقعی استفاده کرد. می توان شخصی را در نظر گرفت که دارای جایگاه های مختلف اجتماعی است. به عبارتی، این فرد به دلیل داشتن فرزند، رابطه پدری و همچنین رابطه همسری با فرزند و همسر خود دارد.
همچنین، این شخص دارای یک خواهر است و بدین ترتیب رابطه برادری با خواهر خود و رابطه فرزندی با والدین خود دارد. به علاوه، این شخص کارمند شرکتی است که با هم تیمی های خود رابطه همکار دارد. بدین ترتیب، این شخص در شرایط مختلف و در رابطه با اطرافیان خود، دارای جایگاه اجتماعی منحصربفردی است. به این حالت، چندریختی یا پلی مورفیسم گفته می شود.
مثالی از چند ریختی در برنامه نویسی
اصل چندریختی دارای مزیت های مختلفی است که در ادامه به مهم ترین آن ها اشاره شده است:
- اصل چندریختی مانع نوشتن کدهای تکراری می شود و می توان از قطعه کدهای نوشته شده به دفعات استفاده کرد.
- اصل پلی مورفیسم باعث می شود خطایابی قطعه کدها راحت تر انجام شود.
- با استفاده از اصل چندریختی می توان از متغیرهای تعریف شده برای ذخیره سازی داده ها با نوع داده مختلف استفاده کرد.
از اصل چندریختی می توان در بخش های مختلف برنامه نویسی استفاده کرد. در این بخش، صرفاً به کاربرد این اصل در نوشتن کلاس در پایتون پرداخته می شود.
چندریختی کلاس در زبان برنامه نویسی پایتون
زبان برنامه نویسی پایتون به کاربران این اجازه را می دهد که در کلاس های تعریف شده، متدهایی با نام های یکسان ایجاد کنند. در این حالت، می توان از هر شی ساخته شده به منظور دسترسی به متدهایی با نام مشابه استفاده کرد. در ادامه، مثالی از نحوه کاربرد اصل چندریختی در ایجاد کلاس در پایتون ملاحظه می شود.
class Tiger():
def nature(self):
print(‘I am a Tiger and I am dangerous.’)
def color(self):
print(‘Tigers are orange with black strips’)
class Elephant():
def nature(self):
print(‘I am an Elephant and I am calm and harmless’)
def color(self):
print(‘Elephants are grayish black’)
obj1 = Tiger()
obj2 = Elephant()
for animal in (obj1, obj2): # creating a loop to iterate through the obj1 and obj2
animal.nature()
animal.color()
I am a Tiger and I am dangerous.
Tigers are orange with black strips
I am an Elephant and I am calm and harmless
Elephants are grayish black
رابطه چندریختی و وراثت در پایتون (بازنویسی متد)
اصل چندریختی با مفهوم وراثت رابطه بسیار نزدیکی دارد. در زبان پایتون زمانی که کلاس فرزندی از کلاس والد ارث بری می کند، تمامی مشخصه های کلاس والد در کلاس فرزند قابل دسترس هستند.
گاهی نیاز است در کلاس فرزند، متدی هم نام با متد کلاس والد ایجاد شود به طوری که این متد شامل دستوراتی مغایر با دستورات متد کلاس والد باشد. به چنین حالتی، «بازنویسی متد» (Method Overriding) گفته می شود که اصل چندریختی این امکان را برای کلاس فراهم کرده است. در ادامه، مثالی از نحوه کاربرد اصل چندریختی و مفهوم بازنویسی متد ارائه شده است.
class Vehicle:
def __init__(self, brand, model, price):
self.brand = brand
self.model = model
self.price = price
def show(self):
print(‘Details:’, self.brand, self.model, ‘Price:’, self.price)
def max_speed(self):
print(‘Vehicle max speed is 160’)
def gear_system(self):
print(‘Vehicle has 6 shifter gearbox’)
# inherit from vehicle class
class Car(Vehicle):
def max_speed(self):
print(‘Car max speed is 260’)
def gear_system(self):
print(‘Car has Automatic Transmission’)
# Car Object
car = Car(‘Audi’, ‘R8’, 9000000)
car.show()
# call methods from Car class
car.max_speed()
car.gear_system()
# Vehicle Object
vehicle = Vehicle(‘Nissan’, ‘Magnite’, 550000)
vehicle.show()
# call method from a Vehicle class
vehicle.max_speed()
vehicle.gear_system()
Details: Audi R8 Price: 9000000
Car max speed is 260
Car has Automatic Transmission
Details: Nissan Magnite Price: 550000
Vehicle max speed is 160
Vehicle has 6 shifter gearbox
چندریختی زمان کامپایل (سربارگذاری متد)
زبان برنامه نویسی پایتون از سربارگذاری متد و چندریختی زمان کامپایل پشتیبانی نمی کند. با این حال، می توان مثالی از پایتون ارائه کرد که به نوعی این وضعیت را نشان می دهد:
class Example:
def multiply(self,a,b,c=1):
print(a*b*c)
example=Example()
example.multiply(5,10)
example.multiply(2,5,6)
در مثال فوق ملاحظه می شود که متد multiply می تواند از شی هایی با دو یا سه پارامتر به منظور محاسبه حاصل ضرب پارامترها پشتیبانی کند. خروجی قطعه کد فوق به صورت زیر است:
50
60
فرا کلاس در زبان برنامه نویسی پایتون چیست ؟
در زبان برنامه نویسی پایتون می توان با استفاده از تابع type() نوع هر ماهیتی نظیر متغیر، کلاس، شی و ساختار داده را تشخیص داد. در مثال زیر، نحوه کاربرد تابع به منظور تعیین نوع داده های مختلف ملاحظه می شود.
num = 23
print(Type of num is:, type(num))
lst = [1, 2, 4]
print(Type of lst is:, type(lst))
name = Atul
print(Type of name is:, type(name))
خروجی قطعه کد فوق به صورت زیر است:
Type of num is:
Type of lst is:
Type of name is:
class Student:
pass
stu_obj = Student()
# Print type of object of Student class
print(Type of stu_obj is:, type(stu_obj))
بر اساس خروجی قطعه کد فوق، نوع داده شی، کلاسی است که از آن ساخته می شود. در مثال فوق، نوع داد شی stu_obj ، کلاس Student است.
Type of stu_obj is:
class Student:
pass
# Print type of Student class
print(Type of Student class is:, type(Student))
همان طور که در خروجی زیر ملاحظه می شود، نوع کلاس Student ، کلاس type است و کلاس Student به عنوان شیئی از کلاس type محسوب می شود.
Type of Student class is:
نوع تمامی کلاس های توکار زبان پایتون نیز از نوع کلاس type هستند. در ادامه، مثالی از خروجی نوع کلاس های توکار پایتون ملاحظه می شود:
for t in int, float, dict, list, tuple:
print(type(t))
خروجی قطعه کد فوق در زیر آمده است:
برای معین کردن نوع کلاس type نیز، می توان از قطعه کد زیر استفاده کرد:
print(type(type))
خروجی قطعه کد فوق در ادامه ملاحظه می شود:
بدین ترتیب، می توان نتیجه گیری های فوق را به شکل زیر خلاصه سازی کرد:
- هر ماهیتی در زبان پایتون به عنوان شی تلقی می شود.
- شی، نمونه ای از کلاس است.
- کلاس در پایتون به عنوان شی محسوب می شود.
- شی کلاس، نمونه ای از فرا کلاس type است.
- کلاس type نیز شیئی از کلاس خودش است.
- کلاس type فرا کلاس تمام کلاس های پایتون است. به عبارتی، تمامی کلاس های پایتون از فرا کلاس ساخته می شوند.
فرا کلاس (Metaclass) در پایتون
فرا کلاس مشخص می کند که کلاس های ساخته شده از آن، چه رفتاری داشته باشند. به عنوان مثال، می توان در فرا کلاس قطعه کدی نوشت که بر اساس آن، هر کلاس فرزندی که از آن ساخته می شود، فقط دارای یک شی باشد. اعمال چنین محدودیتی برای دسترسی به پایگاه داده یا اطلاعات حساس حائز اهمیت است و به منظور کنترل دسترسی و بررسی سطح امنیت، می توان ساخت اشیای کلاس های فرزند را محدود به یک شی کرد.
ساخت فرا کلاس در زبان برنامه نویسی پایتون
class MyMeta(type):
pass
class MyClass(metaclass=MyMeta):
pass
class MySubclass(MyClass):
pass
print(type(MyMeta))
print(type(MyClass))
print(type(MySubclass))
خروجی قطعه کد فوق، در ادامه ملاحظه می شود:
به منظور ساخت فرا کلاسی که از کلاس type ساخته می شود، می توان سه متد فهرست شده در زیر را نیز درون فرا کلاس بازنویسی کرد:
- متد __new__ : این متد، پیش از اجرا شدن متد __init__ فراخوانده می شود و شی کلاس را می سازد و سپس آن را بازمی گرداند. می توان نحوه ساخت شی را با استفاده از این متد تغییر داد.
- متد __init__ : می توان از این متد به منظور مقداردهی اولیه ویژگی های کلاس با استفاده از پارامترهای شی ساخته شده استفاده کرد.
- متد __call__ : دستورات این متد زمانی اجرا می شوند که کلاس فراخوانی شود.
جمع بندی
کلاس و شی یکی از پرکاربردترین ماهیت های برنامه نویسی هستند که بسیاری از برنامه نویسان در پروژه های خود از آن ها استفاده می کنند. قابلیت های این دو جزء برنامه نویسی باعث شده است تا در مفاهیم شی گرایی نیز از آن ها استفاده شود. پایتون به عنوان یکی از زبان های برنامه نویسی شی گرا، از کلاس به منظور پیاده سازی اصول شی گرایی استفاده می کند. در مطلب حاضر، سعی بر این بود تا به ارائه مفهوم کاملی از کلاس، اجزا و مفاهیم مرتبط با آن و نحوه ساخت و استفاده از آن در زبان برنامه نویسی پایتون پرداخته و با ذکر مثال های کاربردی، نحوه پیاده سازی اصول شی گرایی در پایتون با استفاده از کلاس ارائه شود.
ن صفحه از ما حمایت کنید یا با خرید یه فنجون نوشیدنی بهمون انرژی بدید!
- کلاس های پایتون چیست و چه زمانی باید از آن ها استفاده کرد؟
- انواع مختلف Class در پایتون
- رابطه بین اصطلاحات کلاس و نوع برای یک شی پایتون
- نحوه تعریف کلاس جدید در پایتون
- قرارداد نام گذاری پایتون برای کلاس ها
- ویژگی های کلاس چیست و چگونه می توان به آن ها دسترسی داشت
- نحوه نمونه سازی یک شی کلاس در پایتون
- ویژگی های یک شی کلاس
- پارامتر self چیست و چگونه کار می کند
- ویژگی های سازنده کلاس
- نحوه دسترسی، ایجاد یا حذف ویژگی های شی کلاس
- تفاوت بین متغیرهای کلاس و نمونه
یادگیری مفاهیم برنامه نویسی پایتون با مکتب خونه
اگر به فکر یادگیری اصولی برنامه نویسی پایتون هستید، بهترین پیشنهاد استفاده از دوره های آموزشی است. برای این هدف مکتب خونه طیف گسترده ای از فیلم های آموزشی پایتون را به صورت رایگان و پولی ارائه کرده است که می توانید از آن ها استفاده کنید. هم اکنون می توانید با بازدید از صفحه با انواع این دوره ها آشنا شوید. در مکتب خونه انواع دوره آموزشی پایتون موجود است.
منابع مورد استفاده در این آموزش:
- https://www.dataquest.io/blog/using-classes-in-python/
- https://www.tutorialsteacher.com/python/python-class