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)
~\AppData\Local\Temp/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 f”The 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(f”The 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(f”The 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(f”The 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(f”The 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