מתודות סטטיות ומתודות מחלקה
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Python של Coddy. שיעור 39 מתוך 64.
מלבד מתודות מופע רגילות, למחלקות יכולות להיות מתודות סטטיות ומתודות מחלקה שמשרתות מטרות שונות.
הנה דוגמה למתודה סטטית:
class MathHelper:
@staticmethod
def add(a, b):
return a + b
@staticmethod
def is_even(number):
return number % 2 == 0מתודות סטטיות אינן צריכות את self ופועלות כמו פונקציות רגילות. קוראים להן ישירות מתוך המחלקה:
result = MathHelper.add(5, 3)
print(result)
check = MathHelper.is_even(10)
print(check)הנה דוגמה למתודה של מחלקה:
class Person:
count = 0 # משתנה מחלקה
def __init__(self, name):
self.name = name
Person.count += 1
@classmethod
def get_count(cls):
return cls.count
@classmethod
def create_anonymous(cls):
return cls("Anonymous")מתודות מחלקה מקבלות את המחלקה עצמה (cls) כפרמטר הראשון:
person1 = Person("Alice")
person2 = Person("Bob")
print(Person.get_count()) # 2השתמשו בשיטות מחלקה כבנאים חלופיים:
anonymous = Person.create_anonymous()
print(anonymous.name) # Anonymous
print(Person.get_count()) # 3השוו בין כל שלושת סוגי המתודות במחלקה אחת:
class Calculator:
brand = "Python Calc"
def __init__(self, owner):
self.owner = owner
# מתודה של מופע - זקוקה ל-self, ניגשת לנתוני המופע
def show_owner(self):
return f"Owned by {self.owner}"
# מתודה של מחלקה - זקוקה ל-cls, ניגשת לנתוני המחלקה
@classmethod
def get_brand(cls):
return cls.brand
# מתודה סטטית - אינה זקוקה לאף אחד מהם, רק פונקציית עזר
@staticmethod
def multiply(x, y):
return x * ycalc = Calculator("Alice")
print(calc.show_owner()) # בבעלות Alice
print(Calculator.get_brand()) # Python Calc
print(Calculator.multiply(4, 5)) # 20פלט:
8
True
2
Anonymous
3
Owned by Alice
Python Calc
20אפשר לקרוא למתודות מחלקה ומתודות סטטיות גם ממופעים:
calc = Calculator("Bob")
print(calc.get_brand()) # Python Calc
print(calc.multiply(2, 3)) # 6הבדלים מרכזיים:
- מתודות מופע: צריכות
self, ניגשות לנתוני המופע - מתודות מחלקה: צריכות
cls, ניגשות לנתוני המחלקה, ומתאימות ליצרנים חלופיים - מתודות סטטיות: לא צריכות אף אחד מהם, אלא רק פונקציות שירות הקשורות למחלקה
נקודה מרכזית: השתמשו ב-@staticmethod עבור פונקציות עזר ששייכות מבחינה הגיונית למחלקה, אך אינן זקוקות לנתונים של המחלקה או של מופע. השתמשו ב-@classmethod כשצריך גישה למחלקה עצמה, למשל עבור בנאים חלופיים או גישה למשתני מחלקה.
אתגר
קלבאתגר הזה תממשו מחלקה Temperature עם פונקציונליות מסוימת, תוך שימוש במסגרת בדיקות מקיפה.
עליכם לערוך רק את הקובץ temperature.py, בהתאם להערות TODO שמנחות אתכם במימוש. המחלקה צריכה לכלול:
- משתנה מחלקה למעקב אחר קריאות טמפרטורה
- מתודה סטטית להמרת טמפרטורה
- מתודות מחלקה להוספת קריאות ולחישוב ממוצעים
נסו בעצמכם
from temperature import Temperature
# מנגנון לטיפול במקרי בדיקה לצורך בדיקות מקיפות
test_case = input()
if test_case == "default_test":
# בדיקת הפעולה הבסיסית
Temperature.celsius_readings = []
Temperature.add_reading(25)
Temperature.add_reading(30)
Temperature.add_reading(27)
print(f"Average reading: {Temperature.average_reading()}")
print(f"22°C is {Temperature.celsius_to_fahrenheit(22)}°F")
elif test_case == "empty_readings":
# בדיקת average_reading ללא קריאות
Temperature.celsius_readings = []
print(f"Average reading: {Temperature.average_reading()}")
elif test_case == "single_reading":
# בדיקה עם קריאה אחת
Temperature.celsius_readings = []
Temperature.add_reading(100)
print(f"Average reading: {Temperature.average_reading()}")
elif test_case == "negative_values":
# בדיקה עם ערכי טמפרטורה שליליים
Temperature.celsius_readings = []
Temperature.add_reading(-10)
Temperature.add_reading(-20)
Temperature.add_reading(-30)
print(f"Average reading: {Temperature.average_reading()}")
print(f"-15°C is {Temperature.celsius_to_fahrenheit(-15)}°F")
elif test_case == "zero_value":
# בדיקה עם קריאה של 0°C
print(f"0°C is {Temperature.celsius_to_fahrenheit(0)}°F")
elif test_case == "extreme_values":
# בדיקה עם ערכי טמפרטורה קיצוניים
absolute_zero = -273.15 # האפס המוחלט במעלות צלזיוס
sun_surface = 5500 # טמפרטורה משוערת של פני השמש במעלות צלזיוס
print(f"{absolute_zero}°C is {Temperature.celsius_to_fahrenheit(absolute_zero)}°F")
print(f"{sun_surface}°C is {Temperature.celsius_to_fahrenheit(sun_surface)}°F")
elif test_case == "reset_readings":
# בדיקת איפוס הקריאות
Temperature.celsius_readings = []
Temperature.add_reading(10)
Temperature.add_reading(20)
Temperature.add_reading(30)
print(f"Average reading before reset: {Temperature.average_reading()}")
Temperature.celsius_readings = []
print(f"Average reading after reset: {Temperature.average_reading()}")
elif test_case == "decimal_values":
# בדיקה עם ערכים עשרוניים
Temperature.celsius_readings = []
Temperature.add_reading(36.5) # טמפרטורת גוף תקינה
Temperature.add_reading(37.2) # חום קל
Temperature.add_reading(36.9) # שונות תקינה
print(f"Average reading: {Temperature.average_reading()}")
elif test_case == "many_readings":
# בדיקה עם מדידות רבות
Temperature.celsius_readings = []
for i in range(1, 101):
Temperature.add_reading(i)
print(f"Average reading with 100 values: {Temperature.average_reading()}")השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים (OOP)
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםהפרמטר selfמתודותמאפייניםשיטת הבנאי (__init__)חזרה: מחשבון פשוט5פולימורפיזם
בחינה מחדש של דריסת מתודותטיפוסיות ברווזמחלקות ומתודות אבסטרקטיותעיצוב ממשקיםסיכום – מחשבון צורות8מושגים מתקדמים בתכנות מונחה עצמים
קומפוזיציה לעומת הורשהMixinsמתודות סטטיות ומתודות מחלקהדקורטורים למחלקותמנהלי הקשרתרגלו בעצמכם: קומפיילר Python אונליין