ملخص - حاسبة الأشكال
جزء من قسم Object Oriented Programming في رحلة Python على Coddy — الدرس 27 من 64.
التحدي
متوسطفي هذا التحدي، ستقوم بتنفيذ نظام حاسبة أشكال هندسية يوضح مفهوم تعدد الأشكال (polymorphism).
قم بتنفيذ الفئات المطلوبة في الملفات التالية (ابحث عن تعليقات TODO في كل ملف):
shape.py- تعريف الفئة الأساسية المجردةShapecircle.py- تنفيذ فئةCirclerectangle.py- تنفيذ فئةRectangletriangle.py- تنفيذ فئةTriangleunknownshape.py- إنشاء فئة غير مشتقة توضح مفهوم "duck typing"shapecalculator.py- تنفيذ وظائف الحاسبة
اتبع تعليقات TODO في كل ملف للحصول على إرشادات خطوة بخطوة. ستساعدك مجموعة الاختبارات الشاملة على فهم السلوك المتوقع وضمان أن تنفيذك يتعامل مع جميع المتطلبات بشكل صحيح.
ورقة مرجعية
بما أنه لم يتم توفير محتوى للدرس، بل فقط تعليمات التحدي، فلا يمكنني إنشاء ورقة غش (cheatsheet). يجب أن تعتمد أوراق الغش بشكل أساسي على نظرية الدرس ومفاهيمه، مع اعتبار محتوى التحدي مكملاً فقط عندما يحتوي على تفسيرات مفيدة إضافية لم يتم تغطيتها في الدرس.
جرّب بنفسك
from circle import Circle
from rectangle import Rectangle
from triangle import Triangle
from unknownshape import UnknownShape
from shapecalculator import ShapeCalculator
import math
# معالج حالات الاختبار
test_case = input()
def test_basic_functionality():
calculator = ShapeCalculator()
# اختبار مع الدائرة (Circle)
circle = Circle(5)
print(f"Testing {circle}")
results = calculator.process_shape(circle)
print(f"Results: {results}")
print()
# اختبار مع المستطيل (Rectangle)
rectangle = Rectangle(4, 6)
print(f"Testing {rectangle}")
results = calculator.process_shape(rectangle)
print(f"Results: {results}")
print()
# اختبار مع المثلث (Triangle)
triangle = Triangle(3, 4, 5)
print(f"Testing {triangle}")
results = calculator.process_shape(triangle)
print(f"Results: {results}")
print()
# اختبار مع شكل غير معروف (UnknownShape) (كتابة البطة - duck typing)
unknown = UnknownShape("Custom", 10)
print(f"Testing {unknown}")
results = calculator.process_shape(unknown)
print(f"Results: {results}")
def test_edge_cases():
calculator = ShapeCalculator()
# اختبار مع قيم صفرية
print("Testing zero values:")
circle = Circle(0)
print(f"Circle(0) area: {circle.area()}, perimeter: {circle.perimeter()}")
rectangle = Rectangle(0, 5)
print(f"Rectangle(0, 5) area: {rectangle.area()}, perimeter: {rectangle.perimeter()}")
# اختبار مع قيم كبيرة جداً
print("\
Testing large values:")
large_circle = Circle(1000000)
print(f"Circle(1000000) area: {large_circle.area():.2e}, perimeter: {large_circle.perimeter():.2e}")
# اختبار مع قيم عشرية
print("\
Testing decimal values:")
decimal_circle = Circle(0.5)
print(f"Circle(0.5) area: {decimal_circle.area()}, perimeter: {decimal_circle.perimeter()}")
decimal_triangle = Triangle(2.5, 3.5, 4.5)
print(f"Triangle(2.5, 3.5, 4.5) area: {decimal_triangle.area()}, perimeter: {decimal_triangle.perimeter()}")
def test_inheritance():
# إنشاء مثيلات لكل شكل
circle = Circle(5)
rectangle = Rectangle(4, 6)
triangle = Triangle(3, 4, 5)
unknown = UnknownShape("Custom", 10)
# اختبار علاقات الوراثة
from shape import Shape
print(f"Circle is a Shape: {isinstance(circle, Shape)}")
print(f"Rectangle is a Shape: {isinstance(rectangle, Shape)}")
print(f"Triangle is a Shape: {isinstance(triangle, Shape)}")
print(f"UnknownShape is a Shape: {isinstance(unknown, Shape)}")
# اختبار توفر الدوال
print("\
Method availability:")
for shape_name, shape_obj in [("Circle", circle), ("Rectangle", rectangle),
("Triangle", triangle), ("UnknownShape", unknown)]:
print(f"{shape_name} has area(): {hasattr(shape_obj, 'area')}")
print(f"{shape_name} has perimeter(): {hasattr(shape_obj, 'perimeter')}")
print(f"{shape_name} has describe(): {hasattr(shape_obj, 'describe')}")
def test_polymorphism():
calculator = ShapeCalculator()
# إنشاء قائمة من أشكال مختلفة
shapes = [
Circle(5),
Rectangle(4, 6),
Triangle(3, 4, 5),
UnknownShape("Custom", 10)
]
print("Testing polymorphic behavior:")
for i, shape in enumerate(shapes, 1):
print(f"\
Shape {i}: {shape.__class__.__name__}")
results = calculator.process_shape(shape)
print(f"Results: {results}")
def test_duck_typing():
calculator = ShapeCalculator()
# إنشاء فئة جديدة تماماً تحتوي على الدوال المطلوبة
class CustomDuckShape:
def __init__(self, name, factor):
self.name = name
self.factor = factor
def area(self):
return self.factor * 3
def perimeter(self):
return self.factor * 12
def describe(self):
return f"This is a {self.name} duck-typed shape with area {self.area()} and perimeter {self.perimeter()}"
def __str__(self):
return f"Custom {self.name} with factor {self.factor}"
# اختبار مع الشكل المخصص بنظام "كتابة البطة"
duck_shape = CustomDuckShape("DuckTyped", 5)
print(f"Testing duck typing with: {duck_shape}")
results = calculator.process_shape(duck_shape)
print(f"Results: {results}")
# المقارنة مع شكل عادي
circle = Circle(5)
print(f"\
Comparing with regular shape: {circle}")
results = calculator.process_shape(circle)
print(f"Results: {results}")
def test_invalid_inputs():
calculator = ShapeCalculator()
try:
# اختبار مع نصف قطر سالب
print("Testing Circle with negative radius:")
negative_circle = Circle(-5)
results = calculator.process_shape(negative_circle)
print(f"Results: {results}")
except Exception as e:
print(f"Error with negative circle: {e}")
try:
# اختبار مع مثلث غير صالح (أضلاع لا يمكنها تكوين مثلث)
print("\
Testing invalid Triangle (1, 1, 10):")
invalid_triangle = Triangle(1, 1, 10) # ينتهك متباينة المثلث
results = calculator.process_shape(invalid_triangle)
print(f"Results: {results}")
# التحقق مما إذا كان حساب المساحة يعطي نتيجة صالحة
area = invalid_triangle.area()
if math.isnan(area) or not isinstance(area, float) or area <= 0:
print(f"Invalid triangle area: {area}")
except Exception as e:
print(f"Error with invalid triangle: {e}")
# تشغيل الاختبار المناسب بناءً على المدخلات
if test_case == "basic_functionality":
test_basic_functionality()
elif test_case == "edge_cases":
test_edge_cases()
elif test_case == "inheritance":
test_inheritance()
elif test_case == "polymorphism":
test_polymorphism()
elif test_case == "duck_typing":
test_duck_typing()
elif test_case == "invalid_inputs":
test_invalid_inputs()
else:
# حالة الاختبار الافتراضية
test_basic_functionality()جميع دروس Object Oriented Programming
1أساسيات OOP
الملفات الخارجيةمقدمة في OOPClasses مقابل Objectsمعامل selfMethodsAttributesدالة البناء (__init__)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسيةدالة ()superإعادة تعريف الدوال (Method Overriding)الوراثة المتعددةترتيب استدعاء الدوال (Method Resolution Order)مراجعة - هيكلية الموظفين5تعدد الأشكال
مراجعة إعادة تعريف الدوالمفهوم Duck Typingالأصناف والدوال المجردةتصميم الواجهاتملخص - حاسبة الأشكال