اذهب إلى المحتوى
  • 0

مشكلة: كل الكائنات تتشارك نفس البيانات في بايثون

Adam Ebrahim

السؤال

لدي مشكلة في صنف Class في بايثون، الصنف بسيط للغاية، وهو كالتالي:

class MyClass:
    lst = []

student = MyClass()
teacher = MyClass()

student.lst.append(1)
student.lst.append(2)

teacher.lst.append(3)
teacher.lst.append(4)

print(student.lst) # Output: [1, 2, 3, 4]
print(teacher.lst) # Output: [1, 2, 3, 4]

لماذا يتم طباعة نفس النتيجة؟ أو بالأحرى لماذا يحتوي المتغير lst على جميع القيم [1, 2, 3, 4]؟ أليس من المفترض أن يحتوي على رقمين فقط [1, 2] في الكائن student و [3, 4] في الكائن teacher؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 4
class MyClass:
    def __init__(self):
        self.lst = []

بايثون تقدم نوعين لل  attributes هما : class attributes and instance attributes.

ال class attributes تشبه كثيراً ال static attributes في جافا و c++ فهي تتشارك نفس القيمة مع كل ال object  التي تؤخذ من هذا الصف، ويتم تعريف  ال class attributes في بايثون تماماً كما قمت أنت بتعريف المتغير الذي سميته  lst  لذا فكانت القيم هي نفسها.

أما ال instance attributes فهي متغير ينتمي إلى object  واحد فقط أي أن كل متغير تعرفه ك  instance attributes سوف تكون قيمه منفصلة في كل object  تأخذه من هذا الصف ، ويتم تعريف ال  instance attributes تماماً كما عرفتها لك أنا أي ضمن التابع init

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

إن تعريف المتغيرات/الخواص في الصنف مباشرة يجعل هذه الخاصية مشاركة بين جميع الأغراض من هذا الصنف أي shared

لتجنب المشاكل، نقوم بإسناد الخواص من خلال دالة البناءـ حيث يتم إسنادها عن طريف الكلمة المفتاحية self التي ترتبط بالغرض الفريد المنشأ من الصنف و ليس بالصنف نفسه:

class MyClass:
  def __init__(self):
      self.list = []

ليصبح المثال:

class MyClass:
  def __init__(self):
      self.lst = []


student = MyClass()
teacher = MyClass()

student.lst.append(1)
student.lst.append(2)

teacher.lst.append(3)
teacher.lst.append(4)

print(student.lst) # Output: [1, 2]
print(teacher.lst) # Output: [3, 4]

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...