משני גישה
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Python של Coddy. שיעור 29 מתוך 64.
משני גישה קובעים את הנראות של מאפייני מחלקה ומתודות. Python משתמשת במוסכמות שמות במקום במילות מפתח לבקרת גישה.
הנה דוגמה לגישה ציבורית (ללא קידומת):
class Person:
def __init__(self):
self.name = "Coddy" # תכונה ציבורית
def greet(self): # מתודה ציבורית
return f"Hello, I'm {self.name}"אפשר לגשת לחברים ציבוריים מכל מקום:
person = Person()
print(person.name) # Coddy
print(person.greet()) # שלום, אני Coddyהנה דוגמה לגישה מוגנת (קו תחתון יחיד):
class Employee:
def __init__(self):
self._salary = 50000 # תכונה מוגנת
def _calculate_bonus(self): # מתודה מוגנת
return self._salary * 0.1
def show_bonus(self):
return self._calculate_bonus() # אפשר להשתמש בתוך המחלקהגישה לחברים מוגנים (עובדת, אך אינה מומלצת):
employee = Employee()
print(employee._salary) # 50000 - עובד, אבל לא מומלץ
print(employee.show_bonus()) # 5000.0 - הדרך הנכונההנה דוגמה לגישה פרטית (קו תחתון כפול):
class User:
def __init__(self):
self.__password = "secure123" # תכונה פרטית
def __encrypt(self, data): # מתודה פרטית
return f"Encrypted: {data}"
def verify(self, input_password):
# ניתן לגשת לחברים פרטיים מתוך המחלקה
return input_password == self.__passwordהשתמשו נכון בחברים פרטיים:
user = User()
print(user.verify("secure123")) # True - באמצעות מתודה ציבורית
# print(user.__password) # AttributeError - לא ניתן לגשת ישירותפלט:
Coddy
Hello, I'm Coddy
50000
5000.0
Trueנקודה מרכזית: משני הגישה של Python הם מוסכמות שמות: ללא תחילית = ציבורי (נגיש מכל מקום), קו תחתון יחיד = מוגן (לשימוש פנימי), שני קווים תחתונים = פרטי (לשימוש בתוך המחלקה בלבד). הם עוזרים להגדיר גבולות ברורים ולמנוע שימוש שגוי בטעות בפרטים הפנימיים של המחלקה.
אתגר
בינוניבאתגר הזה תממשו מחלקת FileManager שמדגימה את שינויי הגישה של Python (ציבורי, מוגן ופרטי), תוך התנסות ביתרונות של בדיקות מקיפות.
ערכו את filemanager.py כדי לממש את המחלקה FileManager בהתאם להערות TODO. הקובץ מכיל הוראות מפורטות למימוש של:
- מתודות ציבוריות לפעולות על קבצים
- מתודות מוגנות (עם קידומת של קו תחתון יחיד)
- מתודות פרטיות (עם קידומת של שני קווים תחתונים)
- אינטראקציות בין מתודות המדגימות כימוס
נסו בעצמכם
from file_manager import FileManager
# טיפול מקיף במקרי בדיקה
test_case = input()
if test_case == "basic_test":
# יצירת מופע של FileManager
manager = FileManager()
# קריאה למתודה read_file
print(manager.read_file("example.txt"))
# קריאה למתודה get_file_content
print(manager.get_file_content("example.txt"))
elif test_case == "protected_access":
# יצירת מופע של FileManager
manager = FileManager()
# ניסיון לקרוא למתודה המוגנת
# מתודות מוגנות נגישות, אך מיועדות לשימוש פנימי
print(manager._check_permissions("example.txt"))
print("Note: Protected methods are accessible but intended for internal use only")
elif test_case == "private_access":
# יצירת מופע של FileManager
manager = FileManager()
try:
# ניסיון לקרוא ישירות למתודה הפרטית
print(manager.__decrypt_content("some content"))
except AttributeError as e:
print(f"Error: {e}")
print("Private methods are name-mangled and cannot be accessed directly")
# גישה באמצעות צורת השם לאחר עיוות שמות
print(manager._FileManager__decrypt_content("some content"))
print("Note: Accessed private method using name-mangled form")
elif test_case == "method_chaining":
# יצירת מופע של FileManager
manager = FileManager()
# הדגמה כיצד get_file_content קוראת באופן פנימי הן למתודה המוגנת והן למתודה הפרטית
print("Calling get_file_content which internally uses protected and private methods:")
print(manager.get_file_content("example.txt"))
elif test_case == "multiple_files":
# יצירת מופע של FileManager
manager = FileManager()
# עיבוד של כמה קבצים
files = ["document.txt", "image.jpg", "data.csv"]
for file in files:
print(f"\
Processing {file}:")
print(manager.read_file(file))
print(manager.get_file_content(file))
elif test_case == "name_mangling":
# יצירת מופע של FileManager
manager = FileManager()
# הדגמה של עיוות שמות
print("Python's name mangling for private methods:")
print("Attempting direct access would fail with AttributeError")
print("Using mangled name:")
print(manager._FileManager__decrypt_content("private data"))
print("\
Name mangling is Python's mechanism to prevent accidental access")
print("It renames __method to _ClassName__method internally")השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים (OOP)
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםהפרמטר selfמתודותמאפייניםשיטת הבנאי (__init__)חזרה: מחשבון פשוט5פולימורפיזם
בחינה מחדש של דריסת מתודותטיפוסיות ברווזמחלקות ומתודות אבסטרקטיותעיצוב ממשקיםסיכום – מחשבון צורות8מושגים מתקדמים בתכנות מונחה עצמים
קומפוזיציה לעומת הורשהMixinsמתודות סטטיות ומתודות מחלקהדקורטורים למחלקותמנהלי הקשרתרגלו בעצמכם: קומפיילר Python אונליין