متد مخفی در پایتون متدی است که با دو خط زیر (_) شروع میشود. متدهای مخفی برای مخفی کردن جزئیات پیادهسازی کلاس از کاربران استفاده میشوند.
مثال:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"Hello, my name is {self.name}"
person1 = Person("John Doe", 30)
print(person1)
در این مثال، متد __str__ یک متد مخفی است که برای تبدیل شیء به رشته استفاده میشود.
نکات:
- از متدهای مخفی برای جلوگیری از تغییر در حالت داخلی شیء توسط کاربران استفاده میشود.
- از متدهای مخفی برای پیادهسازی توابع داخلی کلاس استفاده میشود.
- نام متدهای مخفی با توافق بین برنامهنویسان انتخاب میشود.
مثال کاربردی:
فرض کنید میخواهیم برنامهای بنویسیم که اطلاعات مربوط به دانشآموزان را ذخیره و مدیریت کند. برای این کار، میتوانیم از متدهای مخفی برای ذخیره اطلاعات محرمانه دانشآموزان استفاده کنیم.
class Student:
def __init__(self, name, grade):
self.name = name
self._grade = grade
def get_grade(self):
return self._grade
def set_grade(self, new_grade):
if new_grade >= 0 and new_grade <= 100:
self._grade = new_grade
student1 = Student("John Doe", 10)
print(student1.get_grade())
student1.set_grade(11)
print(student1.get_grade())
در این مثال، متد _grade یک متد مخفی است که برای ذخیره نمره دانشآموز استفاده میشود. متدهای get_grade و set_grade برای دسترسی به نمره دانشآموز از طریق رابط عمومی کلاس استفاده میشوند.
لیست برخی از متدهای مخفی رایج در پایتون:
__init__: متد سازنده که برای ایجاد و پیکربندی شیء جدید استفاده میشود.__new__: متد کلاس که برای ایجاد و برگرداندن شیء جدید استفاده میشود.__del__: متد مخرب که برای حذف شیء استفاده میشود.__str__: متد که برای تبدیل شیء به رشته استفاده میشود.__repr__: متد که برای تبدیل شیء به نمایش قابل ارزیابی استفاده میشود.__len__: متد که برای محاسبه طول شیء استفاده میشود.__getitem__: متد که برای دریافت عنصری از شیء با استفاده از شاخص استفاده میشود.__setitem__: متد که برای تنظیم عنصری از شیء با استفاده از شاخص استفاده میشود.__iter__: متد که برای ایجاد یک ایتراتور برای شیء استفاده میشود.__next__: متد که برای دریافت عنصر بعدی از ایتراتور استفاده میشود.__add__: متد که برای جمع دو شیء استفاده میشود.__sub__: متد که برای تفریق دو شیء استفاده میشود.__mul__: متد که برای ضرب دو شیء استفاده میشود.__div__: متد که برای تقسیم دو شیء استفاده میشود.__eq__: متد که برای مقایسه دو شیء برای برابر بودن استفاده میشود.__ne__: متد که برای مقایسه دو شیء برای غیر برابر بودن استفاده میشود.__lt__: متد که برای مقایسه دو شیء برای کوچکتر بودن استفاده میشود.__le__: متد که برای مقایسه دو شیء برای کوچکتر یا مساوی بودن استفاده میشود.__gt__: متد که برای مقایسه دو شیء برای بزرگتر بودن استفاده میشود.__ge__: متد که برای مقایسه دو شیء برای بزرگتر یا مساوی بودن استفاده میشود.
1. متد __init__:
این متد برای ایجاد و پیکربندی اشیاء جدید کلاس استفاده میشود. به عنوان مثال:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
person1 = Person("John Doe", 30)
print(person1.name)
# John Doe
print(person1.age)
# 30
در کد فوق، متد __init__ برای ایجاد شیء جدید person1 با نام “John Doe” و سن 30 استفاده میشود.
2. متد __new__:
این متد قبل از __init__ اجرا میشود و برای کنترل پارامترهای ورودی و ایجاد شیء جدید استفاده میشود. به عنوان مثال:
class Person:
def __new__(cls, name, age):
if age < 18:
raise ValueError("Age must be greater than or equal to 18")
return super().__new__(cls, name, age)
person1 = Person("John Doe", 30)
person2 = Person("Jane Doe", 17)
print(person1.age)
# 30
try:
person2 = Person("Jane Doe", 17)
except ValueError as e:
print(e)
# Age must be greater than or equal to 18
در کد فوق، متد __new__ برای بررسی سن قبل از ایجاد شیء جدید استفاده میشود. اگر سن کمتر از 18 باشد، خطای ValueError صادر میشود.
3. متد __del__:
این متد قبل از حذف شیء اجرا میشود و برای انجام عملیات پاکسازی مانند بستن فایلها یا آزاد سازی حافظه استفاده میشود. به عنوان مثال:
class Person:
def __init__(self, name):
self.name = name
def __del__(self):
print(f"Goodbye, {self.name}")
person1 = Person("John Doe")
del person1
# Goodbye, John Doe
در کد فوق، متد __del__ برای چاپ پیام “Goodbye, {self.name}” هنگام حذف شیء person1 استفاده میشود.
4. متد __str__:
این متد برای تبدیل شیء به رشته قابل خواندن توسط انسان استفاده میشود. به عنوان مثال:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"Hello, my name is {self.name} and I am {self.age} years old"
person1 = Person("John Doe", 30)
print(person1)
# Hello, my name is John Doe and I am 30 years old
در کد فوق، متد __str__ برای تبدیل شیء person1 به رشته “Hello, my name is John Doe and I am 30 years old” استفاده میشود.
5. متد __repr__:
این متد برای تبدیل شیء به رشته قابل ارزیابی توسط پایتون استفاده میشود. به عنوان مثال:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"Person(name='{self.name}', age={self.age})"
person1 = Person("John Doe", 30)
print(repr(person1
نکات:
- از متدهای مخفی برای جلوگیری از تغییر در حالت داخلی شیء توسط کاربران استفاده میشود.
- از متدهای مخفی برای پیادهسازی توابع داخلی کلاس استفاده میشود.
- نام متدهای مخفی با توافق بین برنامهنویسان انتخاب میشود.



