کپسوله سازی (Encapsulation)
«کپسوله سازی در پایتون» یعنی محافظت از داده ها داخل کلاس. «کلاس (Class)» قالب ساخت شیء است. «ویژگی (Property)» همان متغیرِ داخل کلاس است. با کپسوله سازی، دسترسی بیرون را کنترل می کنیم و تغییرات اشتباهی کم می شود.
ویژگی خصوصی با __
پیشوند دوتا آندرلاین __ ویژگی را خصوصی می کند. بیرون کلاس مستقیم نخوانید.
class Person:
def __init__(self, name, age):
self.name = name
self.__age = age
p1 = Person("Emil", 25)
print(p1.name)
print(p1.__age)
نکته: دسترسی مستقیم به __age خطا می دهد؛ بیرون کلاس ممنوع است.
گرفتن مقدار خصوصی: Getter
برای خواندن ویژگی خصوصی، یک متد «گیرنده (Getter)» بساز.
class Person:
def __init__(self, name, age):
self.name = name
self.__age = age
def get_age(self):
return self.__age
p1 = Person("Tobias", 25)
print(p1.get_age())
تغییر مقدار خصوصی: Setter با اعتبارسنجی
«ستِر (Setter)» مقدار جدید می گذارد. همچنین مقدار را بررسی می کند.
class Person:
def __init__(self, name, age):
self.name = name
self.__age = age
def get_age(self):
return self.__age
def set_age(self, age):
if age > 0:
self.__age = age
else:
print("Age must be positive")
p1 = Person("Tobias", 25)
print(p1.get_age())
p1.set_age(26)
print(p1.get_age())
مزایای کپسوله سازی
کپسوله سازی داده ها را محافظت می کند، اعتبارسنجی می آورد، و انعطاف می دهد.
class Student:
def __init__(self, name):
self.name = name
self.__grade = 0
def set_grade(self, grade):
if 0 <= grade <= 100:
self.__grade = grade
else:
print("Grade must be between 0 and 100")
def get_grade(self):
return self.__grade
def get_status(self):
if self.__grade >= 60:
return "Passed"
else:
return "Failed"
student = Student("Emil")
student.set_grade(85)
print(student.get_grade())
print(student.get_status())
ویژگی محافظت شده با _
پیشوند یک آندرلاین _ فقط قرارداد است. یعنی «داخل استفاده کن».
class Person:
def __init__(self, name, salary):
self.name = name
self._salary = salary
p1 = Person("Linus", 50000)
print(p1.name)
print(p1._salary)
نکته: پایتون جلویت را نمی گیرد؛ فقط توافق توسعه دهندگان است.
متد خصوصی با __
متد خصوصی فقط داخل کلاس صدا می خورد. بیرون کلاس ممنوع است.
class Calculator:
def __init__(self):
self.result = 0
def __validate(self, num):
if not isinstance(num, (int, float)):
return False
return True
def add(self, num):
if self.__validate(num):
self.result += num
else:
print("Invalid number")
calc = Calculator()
calc.add(10)
calc.add(5)
print(calc.result)
نام برگردانی (Name Mangling)
پایتون نامِ خصوصی را داخلی تغییر می دهد. الگو: _ClassName__name.
class Person:
def __init__(self, name, age):
self.name = name
self.__age = age
p1 = Person("Emil", 30)
print(p1._Person__age)
هشدار: این دسترسی توصیه نمی شود. هدف کپسوله سازی را خراب می کند.
گام های تمرینی
- یک ویژگی خصوصی بساز و مستقیم نخوان.
- Getter و Setter اضافه کن و تست کن.
- اعتبارسنجی بگذار و خروجی را بررسی کن.
برای ادامه، چندریختی را ببین. همچنین فصل وراثت مرتبط است. برای تمرکز سئو، صفحه کپسوله سازی در پایتون را نشانه گذاری کن.
جمع بندی سریع
- ویژگی خصوصی با
__محافظت می شود. - Getter و Setter دسترسی کنترل شده می دهند.
_nameفقط یک قرارداد است.- نام برگردانی فقط برای داخل است.
- اعتبارسنجی از داده بد جلوگیری می کند.