זיהוי מחלקות יורשות בתוך isinstance

אני משתמש בשיטה של מחלוקות יורשות באחד התרגילים, אבל משום מה הקוד לא מזהה את מחלקת האב ומחזיר לי false בפקודה isinstance, ואז הפונקציות שלי לא מתבצעות.

אני מקבל שה type של האובייקט שלי הוא מסוג :<class ‘abc.ABCMeta’>
מדוע זה קורה?

איך נראית פקודת ה־isinstance שלך?


if isinstance(gate, UnaryGate)

למשל.
אבל זה נראה שהוא לא מצליח לפענח בכלל את ה type של המשתנה שלי.

מה קורה כשאתה מדפיס את gate.__class__?
ואת gate.__class__.mro()?

עבור הראשון קיבלתי:
<class ‘abc.ABCMeta’>

ועבור השני שגיאה (descriptor ‘mro’ of ‘type’ object needs an argument)

יש שתי אפשרויות:

  1. או ש־gate שלך נוצר ישירות מ־Gate ולא מאחת ממחלקות הבת.
  2. או שבמחלקות הבת (LogicGate וכו’) ירשת ישירות מ־ABC ולא מהמחלקות שאמורות להיות מעליו.

עשיתי מחלקה אבסטרקטית(1), ממנה יורשת מחלקה מסוימת(2), וממנה יורשת המחלקה הסופית(3). את פונקציית init מימשתי רק במחלקה האמצעית (2). האם יכול להיות שזה הגורם לשגיאה? כי במחשק שחמט גם היה ככה ללא בעיות

שלח לי את הקוד בפרטי

אוקיי, טעיתי בתגובה הקודמת שלי.
מתקן: נסה להבין מה ההבדל בין issubclass לבין isinstance :slight_smile:

4 לייקים

issubclass עובד לי.
אולי בגלל שלא יצרתי מופע של האובייקט אלא קיבלתי אותו בשמו (למשל OrGate) בתוך רשימה, זו הסיבה לכך?

יאפ. זה בסדר שלא יצרת את המופע, פשוט חשוב להבין את ההבדל בין מחלקה לבין המופע שלה :slight_smile:

וואו כמה שחיפשתי פקודה כזאת ולצערי לא מצאתי.
זה הצריך אותי להיות יצירתי ולפתור בדרך אחרת.

לייק 1