English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
استخدام وظيفة super() المدمجة لاستدعاء طريقة من فئة الأم (الفئة الأب).
يستخدم super() لحل مشاكل التوريث المتعدد، حيث لا يكون استدعاء الأساليب من الكلاسيونات الأبوية مباشرة مشكلة في الحالة التوريث الواحد، ولكن يمكن أن تكون هناك مشاكل مثل ترتيب البحث (MRO) وتكرار الاستدعاء (الوراثة المثلثة) وما إلى ذلك.
MRO هو جدول ترتيب تحليل الأساليب للكلاسيون، وهو أيضًا جدول الترتيب لتحليل الأساليب عند توريث الأساليب من الكلاسيونات الأبوية.
في Python، هناك استخدامان رئيسيان لـ super():
يمنحنا ذلك من تجنب استخدام اسم الكلاسيون الأساسي بوضوح
معالجة التوريث المتعدد
في الحالة التوريث الواحد، يسمح لنا بمراجعة الكلاسيون الأساسي من خلال super().
class Mammal(object): def __init__(self, mammalName): print(mammalName, '是一种温血动物。') class Dog(Mammal): def __init__(self): print('الكلب لديه أربعة أرجل.') super().__init__('سگ') d1 = Dog()
نتيجه خروجي
الكلب لديه أربعة أرجل. سگها يك حيوان گرمدمي هستند.
في هذا، نستدعينا كوديًا طريقة __init__() لكلاسيون Mammal (من Dog)
super().__init__('Dog')
بديل
Mammal.__init__(self, 'Dog')
بما أن ليس من الضروري تحديد اسم الكلاسيون الأساسي عند استدعاء العضو، يمكننا بسهولة تغيير اسم الكلاسيون الأساسي (إذا لزم الأمر).
# قم بتعديل الكلاسيون الأساسي إلى CanidaeFamily class Dog(CanidaeFamily): def __init__(self): print('الكلب لديه أربعة أرجل.') # لا تتغير هذا super().__init__('سگ')super() مدمج يرجع بروتوكولًا يحل محل الكائن، يمكن التعبير عنه من خلال التكليف إلى أساليب الكلاسيونات الأساسية. هذا يُسمى بالتوريث غير المباشر (قدرة super() على الاستشهاد بالكائن الأساسي).
بما أن الحسابات غير المباشرة تتم في وقت التشغيل، يمكننا استخدام كلاسيونات أساسية مختلفة في أوقات مختلفة (إذا لزم الأمر).
class Animal: def __init__(self, Animal): print(Animal, '是动物'); class Mammal(Animal): def __init__(self, mammalName): print(mammalName, '是一种温血动物。') super().__init__(mammalName) class NonWingedMammal(Mammal): def __init__(self, NonWingedMammal): print(NonWingedMammal, "不会飞。") super().__init__(NonWingedMammal) class NonMarineMammal(Mammal): def __init__(self, NonMarineMammal): print(NonMarineMammal, "نميتواند شنا كند.") super().__init__(NonMarineMammal) class Dog(NonMarineMammal, NonWingedMammal): def __init__(self): print('سگها چهار پا دارند.'); super().__init__('سگ') d = Dog() print('') bat = NonMarineMammal('خفاش')
نتيجه خروجي
سگها چهار پا دارند. سگها شنا نميكنند. سگها پرواز نميكنند. سگها يك حيوان گرمدمي هستند. سگها حيوان هستند خفاشها شنا نميكنند. خفاشها يك حيوان گرمدمي هستند. خفاشها حيوان هستند
مетод حل كردن ترتيب (MRO) در مواردي كه چندين ارثبري وجود دارد، ترتيب ارثبري روشها است. شما ميتوانيد از ويژگي __mro__ MRO را ببينيد.
>>> Dog.__mro__ (<class 'Dog'>, <class 'NonMarineMammal'>, <class 'NonWingedMammal'>, <class 'Mammal'>, <class 'Animal'>, <class 'object'>)
اين روش كاركرد MRO است:
مетодهاي فراخواني برآمدگان هميشه قبل از روشهاي كلاس پايه فراخواني ميشوند.
در مثال ما، قبل از NonMarineMammal يا NoneWingedMammal كلاس Dog فراخواني ميشود. اين دو كلاس قبل از Mammal فراخواني ميشوند، كلاس بعدي قبل از Animal فراخواني ميشود، و كلاس Animal قبل از كلاس object فراخواني ميشود.
اگر چندين پدر كلاس وجود داشته باشد، مانند Dog (NonMarineMammal، NonWingedMammal) كه چندين پدر كلاس دارند، ابتدا روش NonMarineMammal فراخواني ميشود، چون ابتدا ظاهر شده است.