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

السؤال

نشر (معدل)

أو ممكن بمثال زي هيك 
 new-person() وظيفتها قراءة جميع attributes  person في حال per_name='' اما ان كان per_name !='' لا يتم ادخال الاسم ويتم ادخال باقي البيانات في الحالتين
أو باستخدام الدالة 
show() وظيفتها طباعة جميع attributes  person على الشاشة
 

تم التعديل في بواسطة Wael Aljamal
توضيح السؤال

Recommended Posts

  • 0
نشر

الجزء الأول من الحل، كيفية الوصول لخصائص غرض في بايثون:

في بايثون، يوجد خصائص افتراضية للأغراض من أصل اللغة و خصائص يقوم المستخدم (مستخدم اللغة - المبرمج) بتعريفها.

يمكن الوصول لخصائص غرض بالدالة التالية:

dir(obj)

والتي ستعيد جميع الخصائص:

['__class__', '__delattr__', '__dict__', '__doc__',
'__format__', '__getattribute__', '__hash__', '__init__',
'__module__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__sizeof__', '__str__',
'__subclasshook__', '__weakref__',


'bar', 'foo', 'func']

يمكنك الملاحظة أن الخصائص الافتراضية attributes تبدأ و تنتهي ب __ لذلك يمكننا فصلهم بسهولة عن طريقا الاسم:

>>> [a for a in dir(obj) if not a.startswith('__')]
['bar', 'foo', 'func']

سنعيد قائمة بأسماء الخواص التي عرفها المستخدم (لن يكتب المستخدم خاصية تبدأ ب __ ).

لإعادة الخاصيات بدون الدوال نستعمل:

>>> [a for a in dir(obj) if not a.startswith('__') and not callable(getattr(obj, a))]
                                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

الجزء الثاني ويحوي المثال:

ليكن لدينا شيفرة التلميذ التالية:

class Student:
  id = 1
  f_name = ''
  l_name = 'aljamal'
  age = 18

  def get_attr(self):
    return [a for a in dir(self) if not a.startswith('__') and not callable(getattr(self, a))]

  def print_attr(self):
    print(self.get_attr())

  def print_attr_with_value(self):
    for attr in self.get_attr():
      print("attr: " + attr + "\t value: " + str(getattr(self, attr)))

  def new_person(self):
    for attr in self.get_attr():
      value = getattr(self, attr)
      if isinstance(value, str) and value == '':
        print("attrbut is missed, please Enter:  " + attr)
        #self[attr] = input()
        setattr(self, attr, input())
      else:
        print(attr + "\t is: " + str(getattr(self, attr)))

s1 = Student()

s1.print_attr()
s1.new_person()
s1.print_attr_with_value()

قمت بتعريف صنف طالب student وفيه الدوال التالية:

  • get_attr تعيد قائمة بالخصائص

  • print_attr تطبع الخصائص

  • print_attr_with_value تطبع الخصاصية مع القيمة

  • new_person تسمح للمستخدم بإدخال قيمة خاصية نصية فارغة

بعض الدوال المساعدة المستخدمة:

  • getattr تقرأ قيمة الخاصية للغرض

  • setattr تقوم بإسناد قيمة للخاصية 

  • isinstance للتأكد من نمط خاصية ما للغرض

هذا هو حل السؤال كما فهمته أنا وأرجو أن يكون كما تريدين، في حال وجود أسئلة عن الشيفرة يمكنك طرح أسئلة إضافية، أرجو قرائتها بتمعن.

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...