View Categories

9.4. ملاحظات عشوائية

1 دقيقة

جدول المحتويات

9.4. ملاحظات عشوائية #

إذا تكرر اسم السمة في كلٍّ من المثيل والفئة، فإن البحث عن السمة يُعطي الأولوية للمثيل:

>>> class Warehouse:

        purpose = 'storage'

        region = 'west'

 >>> w1 = Warehouse()

>>> print(w1.purpose, w1.region)

storage west

>>> w2 = Warehouse()

>>> w2.region = 'east'

>>> print(w2.purpose, w2.region)

storage east

يمكن الرجوع إلى سمات البيانات بواسطة الدوال، وكذلك بواسطة المستخدمين العاديين (“العملاء”) للكائن. بمعنى آخر، لا يمكن استخدام الفئات لتنفيذ أنواع بيانات مجردة بحتة. في الواقع، لا شيء في بايثون يُمكّن من فرض إخفاء البيانات – كل ذلك يعتمد على الاصطلاح. (من ناحية أخرى، يُمكن لتطبيق بايثون، المكتوب بلغة سي، إخفاء تفاصيل التطبيق تمامًا والتحكم في الوصول إلى الكائن عند الضرورة؛ ويمكن استخدام ذلك بواسطة ملحقات بايثون المكتوب بلغة سي).

ينبغي على العملاء استخدام سمات البيانات بحذر – فقد يُفسدون الثوابت التي تُحافظ عليها الدوال عن طريق الختم على سمات بياناتهم. يُرجى ملاحظة أنه يُمكن للعملاء إضافة سمات بيانات خاصة بهم إلى كائن مثيل دون التأثير على صلاحية الدوال، طالما تم تجنب تعارض الأسماء – مرة أخرى، يُمكن لاصطلاح التسمية أن يُوفر الكثير من المتاعب هنا.

لا يوجد اختصار للإشارة إلى سمات البيانات (أو الدوال الأخرى!) من داخل الدوال. أجد أن هذا في الواقع يُزيد من سهولة قراءة الدوال: فلا مجال للخلط بين المتغيرات المحلية ومتغيرات المثيل عند تصفح الدالة.

غالبًا ما يُسمى الوسيط الأول للدالة self. هذا ليس أكثر من مجرد اصطلاح: الاسم self ليس له أي معنى خاص في بايثون. مع ذلك، يُرجى ملاحظة أنه من خلال عدم اتباع هذه القاعدة، قد يكون كودك أقل قابلية للقراءة لمبرمجي بايثون الآخرين، ومن الممكن أيضًا كتابة برنامج متصفح فئات يعتمد على هذه القاعدة.

أي كائن دالة يُمثل سمة فئة يُعرّف دالة لمثيلات تلك الفئة. ليس من الضروري أن يكون تعريف الدالة مُضمنًا في تعريف الفئة: كما أن تعيين كائن دالة لمتغير محلي في الفئة أمر مقبول. على سبيل المثال:

# Function defined outside the class

def f1(self, x, y):

    return min(x, x+y)

class C:

    f = f1

     def g(self):

        return 'hello world'

     h = g

الآن، f و g و h جميعها سمات للفئة C تُشير إلى كائنات دالة، وبالتالي فهي جميعها دوال لمثيلات C – h مُكافئ تمامًا لـ g. يُرجى ملاحظة أن هذه الممارسة عادةً ما تُسبب تشويشًا لقارئ البرنامج.

يمكن للطرق استدعاء طرق أخرى باستخدام سمات الطرق للوسيط self:

class Bag:

    def __init__(self):

        self.data = []

     def add(self, x):

        self.data.append(x)

     def addtwice(self, x):

        self.add(x)

        self.add(x)

يمكن للطرق الإشارة إلى أسماء عامة بنفس طريقة الدوال العادية. النطاق العام المرتبط بالطريقة هو الوحدة النمطية التي تحتوي على تعريفها. (لا تُستخدم الفئة كنطاق عام أبدًا). ​​على الرغم من ندرة وجود سبب وجيه لاستخدام البيانات العامة في طريقة، إلا أن هناك العديد من الاستخدامات المشروعة للنطاق العام: أولًا، يمكن للطرق استخدام الدوال والوحدات النمطية المستوردة إلى النطاق العام، بالإضافة إلى الدوال والفئات المُعرّفة فيه. عادةً ما تكون الفئة التي تحتوي على الطريقة نفسها مُعرّفة في هذا النطاق العام، وفي القسم التالي سنتناول بعض الأسباب الوجيهة التي قد تدفع الطريقة إلى الإشارة إلى فئتها الخاصة.

كل قيمة هي كائن، وبالتالي لها فئة (تُسمى أيضًا نوعها). يتم تخزينه كـ object.__class__.

error: Content is protected !!
Scroll to Top