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

السؤال

Recommended Posts

  • 0
نشر

تلك ميزة جديدة في بايثون 3.7 وما بعدها، لغرض إنشاء كلاسات تحتوي على بيانات فقط (بدون أساليب أخرى)، وتُستخدم لتخزين المعلومات التي ستتم نقلها بين أجزاء مختلفة من البرنامج أو النظام.

بالتالي تُسهل إنشاء كلاسات بعدد أسطر أقل من الكود وتُنفذ بشكل ضمني بعض الأساليب الأساسية مثل __init__ و __repr__ و __eq__، وتوفر تمثيلًا نصيًا للكائنات باستخدام __repr__  ومقارنات بسيطة وتحويل البيانات إلى نماذج بيانات أخرى، مثل JSON أو CSV.

تستطيع استيراد الديكوريتور @dataclass من وحدة dataclasses ثم استخدامه لتعريف كلاس بيانات:

@dataclass
class Person:
  name: str
  age: int
  email: str

وذلك التعريف يُنشئ فئة Person مع ثلاثة خصائص  name من نوع str، age من نوع int، و email من نوع str.

ويتم التحقق من نوع البيانات تلقائيًا عند إنشاء مثيل من الفئة، وباستطاعتك تعديل الخصائص بعد إنشاء المثيل، ومقارنة مثيلات الفئة باستخدام عامل المقارنة ==

@dataclass
class Person:
  name: str
  age: int
  email: str

person1 = Person("Jasem", 30, "Jasem@example.com")
person2 = Person("Jasem", 25, "Jasem@example.com")

print(person1.name)  
print(person2.age)  

if person1 == person2:
  print("The persons are equal")
else:
  print("The persons are not equal")

 

  • 1
نشر (معدل)

فئات البيانات في بايثون (Data Classes) تم تقديمها اول مرة من الاصدار 3.7 تقدم طريقة أنظف وأكثر كفاءة لكتابة الClasses التي نحتاج:

يوجد العديد من التوابع التي نكتبها بشكل يدوي والتي تقوم ببعض الوظائف الخاصة بالClass معين سوف نتعرف على بعضها ومثال لهذه التوابع التي تسمى ( "dunder" methods ) واهمها عند تعريف Class يجب تعريف الباني (constructor) الخاص به 

مثال ليكن لدينا الClass الخاص بتعريف عن مستثمر حيث يتعرف عليه ب اسمه و عمره وثروته

 

class Investor:
   def __init__(self,name,age,cach):
        self.name = name
        self.age = age
        self.age = age

 

نلاحظ ضروة استخدام الدالة __init__ لتمكني من تعريف المستثمر 

i1 = Investor("ali",25,8000)
i2 = Investor("Jasem,",20,100000)

 

في حال غياب الباني (constructor) لا يمكن تمرير القيم للكائن 

 

واذا اردنا طباعة i1 يظهر نتيجة بشكل غير مفهوم كالاتي :

 

image.png.c942b36ae449875e5abb5e83a87d1452.png

 

ولحل هذه المشكلة يمكن الاستعانة بالدالة repr  نضيفه على Class ونحدد من خلاله القيمة التي نريد ان نطبعا حين طباعة الكائن من الClass :

class Investor:
   def __init__(self,name,age,cach):
        self.name = name
        self.age = age
        self.age = age

   def __repr__(self) -> str:
       return self.name     

 

نعيد طباعة i1 لتظهر قيمة الاسم الخاصة بهذا الكائن كالاتي :
 

image.png.0744e7905e1dfb0e3c21a9876fe59598.png

 

واذا اضفنا كائن اخر يشابه في بيانته الكائن الاول كالاتي

i1 = Investor("ali",25,8000)
i2 = Investor("Jasem,",20,100000)
i3 = Investor("ali",25,8000)

 

واختبرنا اذا كان متشابهان 

image.png.6c6bcdb527e8ab30cd28eb1a0f6639eb.png

  نلاحظ انه اعطى قيمة خطأ اي انهما غير متساويين علما لو اختبرنا عن تساوي نفس الكائن يعطي انهما مساويين اي يرجع True
image.png.5e9bebe59ff325196fc58a1a0400e8f8.png

 

 ويوجد دالة تساعد هذا Class في تحديد السمة التي نريد المقارنة عليها في حال اردنا تطبيق اختبار المساوات وهي الدالة eq 

وتعرف بالشكل التالي في حال اردنا ان يقارن على الاسم فقط :

class Investor:
   def __init__(self,name,age,cach):
        self.name = name
        self.age = age
        self.age = age
   def __repr__(self) -> str:
       return self.name     
   
   def __eq__(self, Other) -> bool:
       return self.name == Other.name

 

في حال اعدنا الاختبار  تساوي الاولمع الثالث سوف يقول انهما متشابهان كالاتي 

 

image.png.3948f7e7715d3cbd16c0c52f9d47becc.png

 علما انه ولو غيرنا بالميزات الاخرى كالعمر والرصيد سوف يظل يراهم متشابهان وذلك بسبب تعريفك لدالة التساوي لا يؤثرفيها سوا الاسم 

مثال:

image.png.11ab6007862f35a0a67b1508dcc773ea.png

 نلاحظ بقائها تعطي انهما متساويين حيث يمكن اضافة ميزة ميزة والتاكد من تساويهما ويعتبر هذا مجهد في حال كان هناك الكثير لذلك سوف نتعرف على فائدة الData Classes التي توفر علينا مجهود هذه العمليات كالتالي

حيث نستدعي dataclass وبعدها نعرف بمفهوم decorator وهو مفهوم في برمجة كائنية التوجه تقوم بنوع من التغليف للوظائف وتعرف في بايثون بالشكل @dataclass يوضع فوق تابع اوكلاس 

from dataclasses import dataclass 

@dataclass
class Investor:
    name : str
    age : int
    cach : float

 

نلاحظ عدم تعريف تابع باني ولا تابع الاستعراض repr لكن امكننا تعريف كائن منه وعند طباعة الكائن يظهر بمظهر افضل ووفر علينا عناء كتابة التوابع المساعدة السابقة 

image.png.9175f233c0bfb2b0a1ced4c3e732324b.png

 

وعند اختبار التساوي 

image.png.5828d9da30ac048fb3c08860bfd9c233.png

 

اظهر قدرته على معرفة التساوي  وعند تغير قيمة يظهر عدم التساوي وهذا شيئ منطقي لانه يقارن على كل البيانات الخاصة بالكائن

image.png.29a658f736420b89b490c6e0a886fd0a.png

 

لذلك نلخص ان dataclass ساعدنا عللى توفير الوقت والجهد في الخوض في معالجة هذه الامور وجعل الكود افضل واكثر احترافية وقابلية للفهم.

 

وهي مفيدة جدا عند التعامل مع الباينات من قواعد البيانات 

تم التعديل في بواسطة Ali Ibrahim12
  • 0
نشر
بتاريخ 46 دقائق مضت قال Mustafa Suleiman:

تلك ميزة جديدة في بايثون 3.7 وما بعدها، لغرض إنشاء كلاسات تحتوي على بيانات فقط (بدون أساليب أخرى)، وتُستخدم لتخزين المعلومات التي ستتم نقلها بين أجزاء مختلفة من البرنامج أو النظام.

بالتالي تُسهل إنشاء كلاسات بعدد أسطر أقل من الكود وتُنفذ بشكل ضمني بعض الأساليب الأساسية مثل __init__ و __repr__ و __eq__، وتوفر تمثيلًا نصيًا للكائنات باستخدام __repr__  ومقارنات بسيطة وتحويل البيانات إلى نماذج بيانات أخرى، مثل JSON أو CSV.

تستطيع استيراد الديكوريتور @dataclass من وحدة dataclasses ثم استخدامه لتعريف كلاس بيانات:

@dataclass
class Person:
  name: str
  age: int
  email: str

وذلك التعريف يُنشئ فئة Person مع ثلاثة خصائص  name من نوع str، age من نوع int، و email من نوع str.

ويتم التحقق من نوع البيانات تلقائيًا عند إنشاء مثيل من الفئة، وباستطاعتك تعديل الخصائص بعد إنشاء المثيل، ومقارنة مثيلات الفئة باستخدام عامل المقارنة ==

@dataclass
class Person:
  name: str
  age: int
  email: str

person1 = Person("Jasem", 30, "Jasem@example.com")
person2 = Person("Jasem", 25, "Jasem@example.com")

print(person1.name)  
print(person2.age)  

if person1 == person2:
  print("The persons are equal")
else:
  print("The persons are not equal")

 

تقريباً وصلت الفكرة شكراُ لحضرتك

بتاريخ 44 دقائق مضت قال Ali Ibrahim12:

فئات البيانات في بايثون (Data Classes) تم تقديمها اول مرة من الاصدار 3.7 تقدم طريقة أنظف وأكثر كفاءة لكتابة الClasses التي نحتاج:

يوجد العديد من التوابع التي نكتبها بشكل يدوي والتي تقوم ببعض الوظائف الخاصة بالClass معين سوف نتعرف على بعضها ومثال لهذه التوابع التي تسمى ( "dunder" methods ) واهمها عند تعريف Class يجب تعريف الباني (constructor) الخاص به 

مثال ليكن لدينا الClass الخاص بتعريف عن مستثمر حيث يتعرف عليه ب اسمه و عمره وثروته

 

class Investor:
   def __init__(self,name,age,cach):
        self.name = name
        self.age = age
        self.age = age

 

نلاحظ ضروة استخدام الدالة __init__ لتمكني من تعريف المستثمر 

i1 = Investor("ali",25,8000)
i2 = Investor("Jasem,",20,100000)

 

في حال غياب الباني (constructor) لا يمكن تمرير القيم للكائن 

 

واذا اردنا طباعة i1 يظهر نتيجة بشكل غير مفهوم كالاتي :

 

image.png.c942b36ae449875e5abb5e83a87d1452.png

 

ولحل هذه المشكلة يمكن الاستعانة بالدالة repr  نضيفه على Class ونحدد من خلاله القيمة التي نريد ان نطبعا حين طباعة الكائن من الClass :

class Investor:
   def __init__(self,name,age,cach):
        self.name = name
        self.age = age
        self.age = age

   def __repr__(self) -> str:
       return self.name     

 

نعيد طباعة i1 لتظهر قيمة الاسم الخاصة بهذا الكائن كالاتي :
 

image.png.0744e7905e1dfb0e3c21a9876fe59598.png

 

واذا اضفنا كائن اخر يشابه في بيانته الكائن الاول كالاتي

i1 = Investor("ali",25,8000)
i2 = Investor("Jasem,",20,100000)
i3 = Investor("ali",25,8000)

 

واختبرنا اذا كان متشابهان 

image.png.6c6bcdb527e8ab30cd28eb1a0f6639eb.png

  نلاحظ انه اعطى قيمة خطأ اي انهما غير متساويين علما لو اختبرنا عن تساوي نفس الكائن يعطي انهما مساويين اي يرجع True
image.png.5e9bebe59ff325196fc58a1a0400e8f8.png

 

 ويوجد دالة تساعد هذا Class في تحديد السمة التي نريد المقارنة عليها في حال اردنا تطبيق اختبار المساوات وهي الدالة eq 

وتعرف بالشكل التالي في حال اردنا ان يقارن على الاسم فقط :

class Investor:
   def __init__(self,name,age,cach):
        self.name = name
        self.age = age
        self.age = age
   def __repr__(self) -> str:
       return self.name     
   
   def __eq__(self, Other) -> bool:
       return self.name == Other.name

 

في حال اعدنا الاختبار  تساوي الاولمع الثالث سوف يقول انهما متشابهان كالاتي 

 

image.png.3948f7e7715d3cbd16c0c52f9d47becc.png

 علما انه ولو غيرنا بالميزات الاخرى كالعمر والرصيد سوف يظل يراهم متشابهان وذلك بسبب تعريفك لدالة التساوي لا يؤثرفيها سوا الاسم 

مثال:

image.png.11ab6007862f35a0a67b1508dcc773ea.png

 نلاحظ بقائها تعطي انهما متساويين حيث يمكن اضافة ميزة ميزة والتاكد من تساويهما ويعتبر هذا مجهد في حال كان هناك الكثير لذلك سوف نتعرف على فائدة الData Classes التي توفر علينا مجهود هذه العمليات كالتالي

حيث نستدعي dataclass وبعدها نعرف بمفهوم decorator وهو مفهوم في برمجة كائنية التوجه تقوم بنوع من التغليف للوظائف وتعرف في بايثون بالشكل @dataclass يوضع فوق تابع اوكلاس 

from dataclasses import dataclass 

@dataclass
class Investor:
    name : str
    age : int
    cach : float

 

نلاحظ عدم تعريف تابع باني ولا تابع الاستعراض repr لكن امكننا تعريف كائن منه وعند طباعة الكائن يظهر بمظهر افضل ووفر علينا عناء كتابة التوابع المساعدة السابقة 

image.png.9175f233c0bfb2b0a1ced4c3e732324b.png

 

وعند اختبار التساوي 

image.png.5828d9da30ac048fb3c08860bfd9c233.png

 

اظهر قدرته على معرفة التساوي  وعند تغير قيمة يظهر عدم التساوي وهذا شيئ منطقي لانه يقارن على كل البيانات الخاصة بالكائن

image.png.29a658f736420b89b490c6e0a886fd0a.png

 

لذلك نلخص ان dataclass ساعدنا عللى توفير الوقت والجهد في الخوض في معالجة هذه الامور وجعل الكود افضل واكثر احترافية وقابلية للفهم.

 

وهي مفيدة جدا عند التعامل مع الباينات من قواعد البيانات 

شكرا جزيلاً أخ علي على جهدك وأمثلتك الجميلة، تمام اني افتهمت الفكرة

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...