English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

دليل أساسي لتعلم Python

تحكم في العملية في Python

الوظائف في Python

نوع البيانات في Python

عمليات ملفات Python

الأغراض والأشخاص في Python

التاريخ والوقت في Python

معرفة متقدمة في Python

دليل Python

استخدام وظيفة super() في Python و أمثلة

دوال داخلي بايثون

استخدام وظيفة super() المدمجة لاستدعاء طريقة من فئة الأم (الفئة الأب).

يستخدم super() لحل مشاكل التوريث المتعدد، حيث لا يكون استدعاء الأساليب من الكلاسيونات الأبوية مباشرة مشكلة في الحالة التوريث الواحد، ولكن يمكن أن تكون هناك مشاكل مثل ترتيب البحث (MRO) وتكرار الاستدعاء (الوراثة المثلثة) وما إلى ذلك.
MRO هو جدول ترتيب تحليل الأساليب للكلاسيون، وهو أيضًا جدول الترتيب لتحليل الأساليب عند توريث الأساليب من الكلاسيونات الأبوية.

في Python، هناك استخدامان رئيسيان لـ super():

  • يمنحنا ذلك من تجنب استخدام اسم الكلاسيون الأساسي بوضوح

  • معالجة التوريث المتعدد

مثال 1: 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() على الاستشهاد بالكائن الأساسي).

بما أن الحسابات غير المباشرة تتم في وقت التشغيل، يمكننا استخدام كلاسيونات أساسية مختلفة في أوقات مختلفة (إذا لزم الأمر).

مثال 2: 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__ 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 فراخواني مي‌شود، چون ابتدا ظاهر شده است.

دوال داخلي بايثون