طب يا جماعة السلام عليكم، اليوم إن شاء الله هنحل
بعض الأسئلة اللي في الكتاب على موضوع الـ classes و
الـ objects أو الـ object oriented programming طبعًا
هذا الموضوع اللي احنا حكينا فيه في الثلاث محاضرات
الماضية موجود في chapter 7 في الكتاب، تمام هنحل
المحاضرة هذه سؤالين، و هنعطيكوا سؤالين homework و
بعدين إن شاء الله هندخل في الـ .. إذا ضل معانا
وقت هندخل في الموضوع الأخير اللي هو الـ graphical
user interface أو تصميم الواجهات لبرامج الـ python
طيب الآن هروح على أسئلة الكتاب الموجودة في صفحة
26 و .. و 36 و 27 و 37 في
chapter سبعة، تمام
و هبدأ أنا أحل من السؤال الأول، طيب
خلينا نقرأ السؤال يا جماعة، السؤال بيقول the
rectangle class، إيش هي rectangle؟ مستطيل
بتطلب مني أن أعمل class اسمها rectangle عشان يتمثل
بيانات مستطيل، الآن طبعًا احنا ليش .. ليش بدنا class
هنا للمستطيل، الآن له بيانات يا جماعة، المستطيل عشان
أنا أرسم المستطيل بيلزمني له معلومات، إيش هي معلومات
المستطيل؟ الطول و العرض، و ممكن كمان بيلزمني النقطة
اللي بدي أرسم عندها المستطيل، صح؟ أنا كيف بدي أعرف
المستطيل خمسة في ستة، كيف بدي أعرف وين أرسمه؟ تمام
فنقطة البداية تاعت رسم المستطيل مهمة
فالآن أنا طبعًا عشان أمثل نقطة رسم المستطيل و الطول
و العرض بيلزمني على الأقل ثلاث أو أربع متغيرات عشان
أرسم مستطيل يا جماعة، و عشان أمثل مستطيل في
البرمجة بيلزمني متغيرات كثير، بيلزمني مثلًا integer أو
float بمثل الطول، و integer أو float بمثل العرض
وعندي نقطة، النقطة بمثلها بقيمتين صح ولا؟ X و Y، فبدي
أنا مثلًا على الأقل أربع متغيرات أتمثل المستطيل، طب
لو أنا عندي مثلًا بدي أرسم خمسة، ستة مستطيلات، معناها
كل واحد فيهم بدي أربع متغيرات، لأن عشان أسّهل
الموضوع بدي أعمل class حاجة واحدة تمثل كل بيانات
المستطيل، وممكن يكون فيه بيانات ثانية، مثلًا لون
الإطار، تعالَى المستطيل كم بتعب المستطيل، وها كده
معلومات كتير، الآن هو بيقول لي اعمل لي class اسمه
rectangle عشان أتمثل بيانات مستطيل، الـ class
contains أول حاجة two data fields named width and
height، يعني بدي متغيرين اسمهم width و height عشان
أخزن فيهم معلومات الطول و العرض، الـ constructor
طبعًا أنا بدي أضيف عليها دي، يعني هو بسحك الـ width و
الـ height لكن أنا بدي أضيف عليها نقطة عشان أرسم
المستطيل، بدي نقطة أعرف من أين بدأت رسم المستطيل
النقطة الثانية، بيطلب مني a constructor that creates
a rectangle with the specified width and height، a
constructor، الـ constructor يا جماعة هو نفسه الـ
initializer
شوفت الـ initializer الحكيمة المرة الماضية اللي هو
أعطاء قيم مبدئية للـ object عند إنشائه، تمام؟ الـ
constructor هو نفسه كلمة construct يعني إيش؟ يبدأ
الـ constructor بتبني، معنى الباني، تمام؟ ليش؟ لأنه
فعليًا عملية بناء الـ object و أعطاء معلومات إنه
بتبدأ بدايتها من وين؟ من الـ init صح؟ هي الـ init
method هي أول حاجة بتتم تنفيذها عند إنشاء الـ
object، فإيديتها أنها تعطي قيم مبدئية للـ data fields
الموجودة في الـ object، فلمّا يقول على الـ
constructor هو نفسه يعني في الـ initializer يعني
كأنه بيطلب مني أعمل الـ init method، واضح يا جماعة؟
مش في الـ init method إحنا بنعملها جوا الـ class؟ طبعًا
هذا هو اللي طلبه مني، كأنه بيقول لي أعمل لي init
method تأخد بيانات افتراضية للـ width و الـ height
القيم
المبدئية للـ width و الـ height هتكون 1 أو 2، يعني لو
الـ user ما مررهمش هيكون واحد أو اثنين، بعدين
اعمل لي كمان في الـ rectangular class method ثانية
اسمها getArea، فإيديتها أنها تحسب لمساحة المستطيل و
ترجع لي إياها، و method اسمها getParameter تحسب لمحيط
المستطيل و ترجع لي إياها، نقطة مهمة حكيناها المحاضرة
الماضية، إن الـ methods أو الـ functions الموجودة في
الـ class نوعين، فيه setters و getters، فإيديتها إنه
يعطوا قيم و أقرأ قيم، وفيه methods أو functions
ثانية أنا بعملها عشان أقدي وظيفة، أنا بدي أخبي
تفاصيلها عن اللي بدي أستخدم الـ class هذه، يعني مثلًا
المحاضرة الماضية شفنا عملنا calculate total
salary، بتذكرينها؟ فإيديتها أنها تعمل عملية حسابية
تشوف هذا الراجل مستنقف ولا لأ، مستنقف تخصم منه 30%
مش مستنقف أخليه زي ما هو، صح؟ إذا متزوج مثلًا بتزيد له
10% علاوة، مش متزوج بتزيدش العلاوة، مش هي كانت
الحسبة هذه؟ هذه الحسبة كلها أنا عملتها وخبيتها داخل
function على أساس اللي بده يستدعي الـ function هذه
بقى فقط بعمل dot اسم الـ object dot و بينادي الـ
function بدون ما يحتاج يعرف إيش فيه التفاصيل زي ما
إحنا بالضبط بنستخدم object من list و بنعمل dot
sort و بنعرفش إيش بيصير في الـ sort صح ولا؟ sort
لحالها بترتب لي، وهذا هو مبدأ الـ object oriented إن
الناس بتشتغل classes و بتحط فيها code على أساس
يجوا ناس ثانية يستخدموا الـ class هذه بدون ما
يحتاجوا يفهموا تفاصيل الـ code، وهذا بيجعل الناس
المبرمجين يصلوا لمستوى عالي في البرمجة، ومبرمج
متقدمة لأنهم ما بيبدؤوا من الصفر، البرمجة ما بتبدأ from
scratch من الصفر، بيبرمج الحاجة لأ، بيعتمد على حاجات
عملها الآخرين، و بيستخدم الـ classes اللي عملت عشان
يستخدمها و يكمل عليها، زي بالضبط إحنا لما نستخدم الـ
class list و نعمل sort و insert و replace، هذا كلها
ناس تقعب عليها و اشتغلت عليها، و إحنا بنستخدمها على
الجاهز، صح ولا لأ؟ هذا مبدأ الـ object oriented اللي
هو أنا بعمل code و بيقدي وظائف مفيدة، و المستخدم
بتاع الـ code هذا مش لازم يفهم إيش فيه في الـ code
هذا اللي بنسميه الـ encapsulation، حكينا عن المصطلح
هذا، encapsulation معناه إن الـ functions الموجودة
جوا الـ class بتقدي code وفيها code و تفاصيل كثير
اللي بيستخدم الـ code اللي ما هو ولا مهتم يفهم إيش
فيه في التفاصيل، ماشي يا جماعة؟ فلان هو طالب مني في
الـ class بتاعتي أعملك function اسمها getarea
فإيديتها إنه فقط استدعيها و تحسب لي المساحة و
ترجع لي إياها، أنا مش معرف معدلة المساحة بتاعة المستطيل
اللي هي إيش؟ الطول في العرض، مش مع، افرض يعني افرض
المستطيل شكل سهل، افرض شكل أصعب منه، تمام؟ أنا بس
بقول له get area بحسب لي المساحة و برجع لي إياها، get
perimeter اللي هو إيش؟ الـ perimeter محيط الشكل، تمام
إيش معدلة المحيط بتاعة المستطيل؟ مش مو أطلعه صح أو
الطول زائد العرض الكل في اثنين، طيب طالب مني أعمل
function زيّه، طيب الي أعمل implement هذه السؤال
المطلوب مني، draw the UML diagram for the class، هذا
مش معانا، مش مانعش نرسم UML diagram and implement
the class، يعني اكتب الـ class برمجها، write a test
program، إيش يعني test program؟ يعني بعد ما تعملنا
class بنستخدمها، بننشئ منها objects، بننشئ two
rectangle objects، هذه المعلومات الأولى الـ Width و
الـ Height تبعها، و الثاني الـ Width و الـ Height
تبعه زيّك، و لكل واحد فيهم اعرض له الـ Width و الـ
Height و الـ Area و الـ Perimeter، تمام؟ خلّيني
الآن أروح نعمل الـ class المطلوب مني، بدي أروح أعمل
ملف جديد Python file، بدي أسميه مثلًا shapes أشكال
يعني، و جواب أعمل الـ class rectangle
أول حاجة نتفق إيش البيانات بتاعة ال rectangle
يقولنا فيه width و فيه height و فيه نقطة صح اللي
هي بيمثلها بإيش النقطة X و Y لكل واحدة من هذول
بدي get و set فبدي أقول له def get width أو مثلا
set width في الأول مش هيفرق الترتيب ببعت متغير
اسمه width و بقوله نروح على ال self اللي هو مكان ال
object في الذاكرة وعمل فيه متغير اسمه width وحط
فيه قيمة ال width الآن if get width هيعمل return
self.width بنفس الطريقة بدي أعمل لها height
يعني مثل اسمها set height تأخذ متغير اسمه H تأخذه
و بتحطه في متغير اسمه height موجود داخل ال self لاحظ
اسم المتغير هذا مش نفسه عشان نبين لكم مش لازم يكون
نفسه بعدين get height
هيروح لل self ويقرأ قيمة الـ H لأن دا عندي النقطة
بتاعة رسم المستطيل لأن قلنا ممكن أعملها أكثر من
طريقة ممكن أعتبر أن ال X حاجة و ال Y حاجة و أعمل
لكل واحدة إيش بعمل لكل واحدة set to get set X get
X set Y get Y وممكن أعملهم كلهم في method واحدة
أعمل method واحدة اسمها set X Y تمام أبعت له قيمتين
و method اسمها get x y ترجع قيمتين للسرعة يعني فبدأ
أقول له مثلا def set
مثلا x y مع بعض أبعت له مش .. هنا ببعت له قيمتين
أبعت له x و y مدام أن ببعت له قيمتين بدي أخزن القيمتين
في ال self فبدأ أقول له self.x يساوي x و self
.y يساوي y الآن def get xy طبعا
احنا بنعرف أن في ال python ممكن نعمل function
بترجع content إن أعمله return self.x فاصلة self.y
بس طبعا بدي انتبه لما أستدعي ال function هادي بدي
يكون القيمة المرجعة فيها أحط قيمتين أو two
variables عشان يخزنوا القيم اللي هترجع منها طيب
يعني أنا يا جماعة أنا عملت ال set و ال get methods
اللي موجودة في ال class اللي هنضاله هي نعمل ال
constructor اللي هو عبارة عن أي function ال __init__
def __init__ هذا هو إيش طلب ال constructor
يأخذ width و height width و height وحكالي أعطيهم
قيم قيم افتراضية بحيث أن ال user لو ما مررهمش
هياخد القيم الافتراضية هذه معكم يا جماعة طيب إيش
بده يسوي الآن في ال width و ال height هذول بده
يخزنهم برضه في ال self فبدي أقول له self.width
self.height يعني
عند إنشاء ال object ممكن أمرر قيمتين اللي هما width
و height هياخد ال width ويخزنها في ال self و
هياخد ال height ويخزنها أيضا في ال self هذا في
حالة إن أنا حابب إنه ينشأ ال rectangle وعلى طول
أعطيه قيمة افتراضية بدل ما أستدعي ال set width و
ال set height لو مرة مش ال user هيطلع error لأنّه
فيه قيمة افتراضية معطية لهم طيب الآن عملنا ال
functions الأساسية في ال class هو طلب من الآن أعمل
لي برضه function اسمها getArea تحسب للمساحة وترجع
لها فبدي أعمل function def اسمها getArea getArea
إيش بدها تعمل؟ كيف بدها تحسب المساحة تحت المستطيل
الطول في العرض تمام؟ بنعرف متغير اسمه area يساوي
الطول كيف بنجيبه؟ بدنا نستدعي ال function بتاعة
الطول بس أنا مدام أنا جوا ال class تمام؟ بدنا نقول
له self.get width ضرب self.get height
هيضربوا
في بعضهم يخزن النتيجة في ال area وبعدين بده يرجع
مين ال area ممكن على طول اختصارا أقول له لا بنرجع
ال return احنا بنرجع تمام get area بعدين def get
برضه وطلب مني perimeter اللي هو محيط .. محيط
الشكل الطول زائد العرض كلهم في اثنين فبدأ أقول له
return self.width زائد
self.get height وهذا كله أضربه في 2 والناتج كله
أعمله return هيك ال class صارت كاملة تمام؟ فيها
constructor بيعطيها افتراضية لل width و ال height
فيها set to get method لل width و ال height و ال
point وفي عندي two methods واحدة منهم بترجع لل
area والثانية بترجع لل perimeter لحد الآن أنا
مستفدتش من ال class صح ولا؟ ال class لا ما لهاش
قيمة إلا لو أنا أنشأت منها object فبدأ أروح الآن
في البرنامج أعمل ملف ثاني اسمه مثلا test01
وأروح أنشئ objects من ال class اللي عملته هو حكالي
طلب مني أنشئ two objects ال object الأول بدي أسميه
مثلا R1 يساوي اه
بدي أعمل import بس قبل from shapes import
rectangle R1 هي rectangle
لو ما بعثتش parameters بمشي لأنّه هياخد إيش P1 و P2
لكن هو طلب مني أن أبعد قيمة الأول 44 يعني ال width
أربعة وال height أربعين ال rectangle الثاني أنا
بدأ أعمل أكثر من object تلاتة ونص وخمسة وتلاتين
point سبعة تلاتة ونص خمسة وتلاتين point سبعة هكذا
أنا أنشأت two objects كل واحد له أبعاد مختلفة لأن
إيش طلب مني طلب مني أن لكل rectangle أطبع ال
width و ال height و ال perimeter و ال area و ال
point بنطبعه كمان لأن بدل من عيد أمر الطباعة لكل
واحد فيهم خليني أنا أعمل loop صح ولا الآن احنا في
عندنا أطبع print لل width و print لل height و
print لل point و print لل area و print لل
perimeter بدل ما أكتب الأسطر هذه مرة وهيطلع عشر
أسطر بعمل loop فبقول list 1 يساوي R1
R2 وبعدين بقول for i in list 1 لأن أطبع ليه خلينا
نقول ال i.get width print i.get height print i.get
xy print i.get area
وبعدين نطبع سطر خط عشان نفصل الأول عن الثاني
المستطيل الواحد يعمل loop على ال list بتاعة
المستطيلات يطبع ال width و ال height و ال x و ال y
و ال area و ال parameter تعالوا الآن نعمل run في
عندنا مشكلة هنا اللي هي return has no attribute x
عشان برجع قيمتين نشوف لو عملنا هنا متغيرين هنا
طبعنا ال X هنا طبعنا ال Y على
فكرة مش هذه المشكلة المشكلة أننا لم نعطيه قيم طيب
ال return هذه زي ما كانت
مش عارف إذا باين الرقم ولا لأ الآن هذه بيانات
المستطيل الأول وهذه بيانات المستطيل الثاني تمام؟
هذه الأول طبعا له أربعة وأربعين وشايفين ال X وY
طبعا لهم خمسة عشرة وبعدين هذه المساحة وهذه المحيط
الثاني هذه نفس الشيء وهذه المساحة وهذه المحيط
طيب يعني أنا في النهاية استفدت من ال class
rectangle لأن أنا جمعت بيانات ومعلومات كل
rectangle في حاجة واحدة بتعامل معها بدل ما أتعامل
مع أكثر من حاجة طيب هذا حل السؤال الأول السؤال
الثاني السؤال سبعة اثنين مطلوب كواجب سؤال
سبعة اثنين وسبعة أربعة دول واجب بس سبعة اثنين
وسبعة أربعة أنا بدي أحل سبعة واحد وسبعة تلاتة سؤال
سبعة تلاتة بيحكي عن ال account ال bank account
الآن لما أجي أمثل حساب شخص في ال bank أيضا الحساب
بيمثل بيانات كثير من ضمنها مثلا رقم الحساب اسم
حامل الحساب نوع الحساب قد إيش عنده رصيد قد إيش نسبة
الربح قد إيش الحركات على الحساب معلومات كثير أيضا بما
أن ال account حاجة واحدة معلومات كثير الأفضل أن
أمثل ال account ب class واحدة كتجميع لمعلومات ال
account كلها هنا حدث في السؤال رقم التلاتة بطلب
مني أن أعمل class اسمها account بتمثل حساب
المستخدم في البنك design a class named account
that contains بطلب مني private data field named
ID for the account نحن نحكي عن كلمة private قدام
شوية يعني في عندنا data type أو من معلومات الحساب
اللي هي ال ID رقم الحساب ومن معلومات الحساب كمان
حاجة اسمها ال balance اللي هو إيش يعني الرصيد اللي
موجود في الحساب ومن معلومات الحساب ال annual
interest rate إيش يعني annual interest rate annual
إيش يعني annual سنوي interest ماذا يعني interest
اهتمام بس هنا بتجي معنا فائدة تمام rate معدل معدل
الفائدة السنوي بتصير معدل الفائدة السنوي طبعا هذا
الكتاب عمله أجانب وفي عندهم ربع وفوائد وكذا
احنا بنحله زي ما هو معدل الفائدة السنوي يعني
الحسابات طبعا مختلف معدل الفائدة مثلا حساب التجار
له فائدة أعلى من حساب الناس العاديين وهكذا هذا من
المعلومات الخاصة في الحساب ال ID وال balance رصيد
تبع الحساب وجدش معدل الفائدة السنوي هذه معلومات
الحساب يعني كام متغير بتعامل معاه أنا تلاتة لحد
تلان ال ID وال balance وال annual interest rate
كل واحدة من هدولة بدهم إيش set to get فبطلعه set
methods الآن طالب مني كمان A constructor يعني بتعمل
implement لل in it method اللي هي بتعمل اللي بتاخد
قيمة افتراضية لل ID ال default 0 ال balance ال
default 100 وال annual interest rate ال default 0
طيب بطلب مني accessor and mutator methods ماذا يعني
Accessor and Mutator Methods؟ هدولة هما نفسهم
الـSetters والـGetters كلمة Accessories، ماذا
يعني Accessories؟ من كلمة Access، يعني الحاجات
اللي بوصلها إلي، تمام؟ اللي هي عملية الـGet،
الـMutators الحاجات اللي بتعدل على القيم، اللي هي
method إيش؟ الـSet، الـGet هي القراءة والـSet هي
اللي بتعدل على القيم، صح؟ يعني بقول يعملي set to
get method لحد الآن لحد السطر هذا كل المطلوب مني
أن أعمل class اسمها account الها تلاتة variables
ID, balance, annual interest rate وconstructor
بياخد قيمة مبدئية صفر للـ ID و100 لل balance و
0 لل interest rate وبدي أعمل set to get method لل
ID وال balance وال annual interest rate طلب مني
أعمل method اسمه monthly interest rate معدل الربح
الشهري اللي دخله في ال object هيكون معدل الربح
السنوي طالب مني أعمل method تراجع معدل الربح الشهري
اللي هو هيكون كيف بحسبه؟ معدل الربح السنوي على 12،
صح ولا؟ بيطلع عند الربح في الشهر، معدل الربح
الشهري، معدل الربح الشهري غير الربح الشهري، تمام؟
يعني معدل الربح الشهري يعني مقدش بيربح نسبة ربحه
في الشهر، يعني بيربح مثلا واحد في المية، إيش يعني
واحد في المية؟ يعني من كل ميت شكل 10% يدخل 10 شكل
شهريًا، فالنسبة غير النبح، نسبة النبح ليست معدلة
للنبح، طيب جالي اعملي method ثاني اسمها get
monthly interest، لاحظ الفرق، هذا اسمها get
monthly interest rate وهذا get monthly interest
أكيد ال monthly interest بعتمد على monthly
interest rate كيف يبدو يحسبها ال monthly interest
إيش يعني monthly interest أول حاجة الفائدة الشهرية
يعني مثلا لو عنده ألف شكل في الشهر ومعدل الربح
الشهري واحد في المية كيف هحسب ربح الشهري ألف شكل
بيربح في واحد في المية هيطلع جدش مثلا عشرة شكل عشرة
شكل عفوا أنتم معايا بقى يا جماعة فهو بيقول يعمل لي
method تحسب لي ال monthly interest هنعملهم احنا
بعدين اعمل لي method اسمها withdrawal إيش يعني
withdrawal يعني ينسحب أو يسحب تمام
مثلا the Israeli army withdrew from Gaza in 2005
إيش يعني؟ الجيش الصهيوني انسحب من غزة في عام 2005
وwithdraw يعني انسحب وبتيجي معنى عيش اللي أبحث عنه
عندما أسحب من البنك ويقول withdraw تمام؟ لما يسحب
رصيد يعني فعمله method اسمها withdraw يعني لف سحب
من الرصيد كيف هده بدي هتشغل السحب من الرصيد؟ أكيد
طبعا لما أجي أسحب هده method بتاخد مبلغ يعني بدي
أقول له withdraw بدي أقول له اسحب 100 200
300 صح ولا؟ عندما يسحب يتأكد أن هناك رصيد يغطي
المبلغ، وإذا كان هناك رصيد يغطي المبلغ، فهو سينقص
المبلغ اللي سحبته من الرصيد، وإذا لم يكن هناك
رصيد، فهو سينقص المبلغ، وإذا لم يكن هناك رصيد، فهو
المبلغ، وإذا لم يكن هناك رصيد، فهو سينقص المبلغ،
وإذا لم يكن هناك رصيد، فهو سينقص المبلغ، وإذا لم
يكن هناك رصيد، فهو سينقص المبلغ، وإذا لم يكن هناك
رصيد، فهو سينقص المبلغ أو دع اي دع تمام اللي هي
اللي تاخد مبلغ وتضيفه على حساب تمام هذه كلها
المعلومات بدي احطها وين يا جماعة في ال class خليني
نمشي فيهم واحدة واحدة الآن
بدي اروح اعمل class جديدة ممكن على فكرة اعمل ال
class في نفس الملف ممكن اجي تحت مش أنا عملت class
shape class rectangle ممكن اعمل class ثانية تحتها
اسمها account تمام وابدأ اكتب إيش يعني ممكن احط
أكثر من class في نفس الملف واضح يا جماعة بس احنا
خلينا نفصلهم نكون أفضل امتى بنحط أكثر من class في
نفس الملف؟ لما تكون ال classes لعلاقة ببعض يعني
لما أكون أنا أعمل class بتمثل مثلث ومستطيل ومربع
ودائرة بحطهم كلهم في ملف واحد اسمه shapes طيب
اللي أنا بدي أعمل ملف جديد اسمه مثلا bank info و
جوا ال bank info بدي أعمل class اسمها account
معلومات الـ account زي ما حكينا ID و balance
وannual interest rate كل واحدة منهم ديف بدها ديف و
get ديف .. ديف set و get ديف set طبعا حاجة معلومة
هنمر عليها في الآخر هي private لسه ما تطرقناش إليها
set ID self
.id يساوي ID
يعني صارت فيه حاجات كتير مكررة صح ولا لأ diff
getid return
self.id بدنا
الآن balance IP
Def set annual interest rate اختصارا
self dot annual interest rate يساوي annual
interest rate
لأن أنا عملت method اسمه set annual interest rate
بتاخد متغير اسمه AIR اختصار ل annual interest rate
هتاخد هذا وتخزنه في متغير في السلف اسمه برضه
annual interest rate AIR get annual interest rate
بتروح يغيي اقرأ المتغير ال AIR اللي موجود في السلف
طب هيك عملت أنا ال set وال get method اللي
موجودين في ال class طلب مني المطلوب الثاني اللي هو
constructor تمام ال constructor اللي هو ال in it
تمام
ممكن على فكرة نحطها تحت مش شرط نحطها فوق بس احنا
نتعود دائما أن ال in it نحطه فوق تمام def
underscore in it هذا هياخد تلت قيم اللي هي ال ID
وال balance وال AIR القيم الافتراضية ال ID صفر ال
balance 100 وال AIR صفر إيش بدو يعمل فيهم هدولة بدو
يخزنهم في ال self صح self.id يساوي ID self
.balance يساوي balance و self.air يساوي AIR تمام
للمرة قيم مبدئية كلها هتتخزن داخل السلف طيب اللي
هنعملها مكونات ال class الأساسية نيجي الآن لل
functions الإضافية اللي طلبه هو أول حاجة طلب مني
أعطيني ال monthly interest rate اللي هو ببساطة ال
annual interest rate على .. على إيش؟ على 12 طبعا؟
طيب إيش اسم ال function اسمها هو جالي get monthly
interest rate إيش
بدها تعمل هذه بدها تجيب الـ annual interest rate و
تقسمه على 12 و ترجع النتيجة صح يعني على طول return
self.get_annual_interest_rate على 12 خلصناها
تمام خلصنا الـ function مش الـ class لسه ضايل فيه
methods ثاني فيه كمان diff اسمها get annual
interest
عفوا get monthly interest
هو بحكيلي إن الـ monthly interest interest بدك تجيب
الرصيدة الشخص و تشوف قد إيش هيربح في الشهر كيف
بنعملها؟ بنجيب رصيد الشخص و نضربه في إيش؟ في إيش
نضربه؟ ما لكم يا جماعة؟ ربح الشخص كده؟ نجيبه انسوا
البرمجة، تمام؟ واحد ربحه الشهري ثلاثة في المئة،
تمام؟ الـ balance نضربه في إيش؟ في ثلاثة في المئة، صح
ولا لأ؟ أنتم علمي ولا أدبي معظمكم؟ حتى لو أدبي ما
الأدبي بياخدوا رياضيات صح ولا لأ ما فيش هذا كله ضرب
و قسمة
طيب return self
.get_balance صح ولا لأ هاي الرصيد تبعه هذا
هينضرب في قد إيش نسبة الربح الشهري اللي هي في self
ضرب get_monthly_interest_rate مرة
ثانية الـ object بياخد الـ annual interest rate الـ
monthly interest rate معدل الربح الشهري هو معدل
الربح السنوي على 12% إذا واحد بيربح 10% في السنة في
الشهر كم هيربح؟ 10% على 12 يعني 1.2% في الشهر
الواحد كوم 1.2 1.2 بيطلع 10% في الآخر تمام الـ
monthly
interest ربح الشهري فعليا الفلوس كم هياخد في
الشهر؟ بنجيب الرصيد تبعه و بنضربه بمعدل الربح
الشهري إذا هو بياخد واحد في المئة في الشهر بجيب
رصيده و بضربه في واحد في المئة بيطلع كده ربحه
الشهري بقي هنا method اللي هو withdraw و deposit
اللي هو السحب والإيداع طب بدنا نعمل واحدة واحدة
أكيد الـ withdraw ده بتاخد مبلغ، صح؟ يعني أنا بدي
أمرنيلها مبلغ عشان تخصمه من مال؟ من الرصيد تبعه،
يعني أنا عند رصيد ألف، سحبت 200، بنفع يضل ألف زي
ما هو؟ لأ، المفروض يقل، فـ withdraw بتاخد مبلغ،
بقوله مثلا هنا amount متغير أول حاجة قبل أن أقسم
المبلغ أتأكد هل في رصيد يغطي الـ amount ولا لا
فبقول له if self.get_balance أكبر من أو يساوي
الـ amount إيش معناه الكلام هذا؟
الرصيد أكبر من أو يساوي مبلغ الـ amount معناه فعلا
أنا في عندي فلوس بقدر أسحب منها في الحالة هذه، ماذا
يجب أن يفعل؟ يجب أن يطرح الـ amount من الـ balance
صح أو لا؟ فشوف ماذا ستفعل الآن، سأعمل متغير اسمه B
سأقول له self.get_balance هنا، لسه لم نعدل الرصيد،
جبنا الرصيد الأساسي تمام؟ بهذه، سنطرح منها الـ
amount، ما هو هذا السطر اللي بيعمل؟ بطرح من B الـ
amount و بخزن النتيجة جوا في B بعدين بدي أروح للـ
self و أقول له set_balance و أعطيه قيمة الـ B أنا
الآن يا جماعة الهدف تبعي أني أغير قيمة الـ balance
الموجود ليش أغيره؟ عشان أسحب منه الـ amount تمام؟
كيف غيرته؟ أول حاجة قرأت قيمة الـ balance في متغير
اسمه B ماشي راح طرحت من الـ B هذه قيمة الـ amount و
بعدين روحت قلت له set_balance أعطيه الرصيد الجديد
بعد ما انطرح منه الـ amount واضحة الفكرة هذه يا
جماعة؟ هذه عملية إيش؟ عملية السحب لسه ما خلصناش
السحب لأن هذا امتى هيعملها السحب؟ لو كان عند رصيد
بيغطي else إيش يعني؟ مش رصيده بيغطيها بيخليه يطبع له
رسالة insufficient balance رصيده غير كافية بيغطيها
تمام واضح الـ function هذه يا جماعة كيف كتبت الـ
code تبعها هذه
عملية السحب def يعني عملية الـ Deposit، الإيداع في
الرصيد نفس
السحب بدها تاخد مبلغ، بس إيش بدها تعمل في المبلغ
هذا؟ بدها تضيفه على الـ balance، تمام؟ بدنا نقوله
مثلا amount، طبعا الـ deposit هذي بسيطة، كل اللي
بدها تعمله
كيف بدي أعمل الـ plus هذه؟ أول حاجة بدي أقرأ الرصيد
القديم وأضيف عليه وأروح أعدل عن طريق الـ set طبعا
يعني نفس الشيء بقول بـ self.get_balance و
بعدين بـ B بروح بأضيف عليها الـ amount و بعدين بقول
self.set_balance الـ B هيك أنا عملت الإيداع في
حد عنده أي سؤال يا جماعة؟ في نقطة مش واضحة طب في
نقطة واضحة طب
هيك أنا خلصت الـ class بكرا في الامتحان زي هيك
هجيب لكم سؤال طبعا طب لسه الـ class دي أنا ما استفدت
منها حاجة امتى بأستفيد منها لما أعمل منها objects
لما
بدنا نروح على البرنامج تبعي
بدي أعمل object من مين؟ من account تعال نشوف هو
إيش طلب مني؟ يعني لما يجي يعمل test write
a program that creates an account object with an id
1122 with a balance of 20,000 and annual interest
rate of 4.5% هذه المعلومات للحساب اللي بدنا نشوفه
اعملي account جديد c1 معلش هذاك بده import برضه صح
from bank_info import account لاحظ إنه أنا ممكن في
نفس البرنامج أتبقى أستخدم أكثر من class طيب الآن
بحكيله c1 يساوي account و بمرر له بيانات الـ account
اللي هو حكاله إن الـ ID تبقى 1 1 2 2 و الـ balance
عشرين ألف تمام و الـ annual interest اللي يتربحه
السنوي أربعة و نص use withdraw عشان تسحب 2500 طبعا
يعني كيف نسحب الآن بنروح لـ C1 و نقول withdraw 1500
أيوه
إيش السؤال؟ قولي عشان
أفرجيكم إنه ممكن نستخدم أكثر من class في نفس
البرنامج طبعا يعني هي أنا مثلا ها عشان ما تزعلوش
هذا كله همحيه كمان شوية عشان ما يشوفوش تمام؟ بس
ما فيش معنى إن أنا أستخدم أكثر من class في نفس
البرنامج طيب هي عملنا withdraw لـ 2500 بعدين استخدم
deposit لـ 3000 يعني أروح لـ C1 و أعمل deposit بعد هيك ل
3000 بعدين
print الـ ID و الـ balance و الـ monthly interest
rate و الـ monthly interest بنعمل print
الرسيد الموجود print c1.get_monthly_interest_rate
print c1.get_monthly_interest_rate طبعا monthly
interest rate المفروض يكون أربعة و نص على اثنا عشر الـ
monthly interest هيكون الرصيد اللي بيضل في الحساب
ضرب معدل الربح الشهري هلجيتها هنحسبها هنطلعها ..
هنجيب الآن الحاسبة و نجرب المعلومات هذه طيب تعال
نعمل run تمام بيحكيلي الآن الـ ID
رصيد الحساب 20500$ لماذا كان 20000$ سحبنا منه 2500
$ و حطينا 3000$ يعني زاد 500$ عشان هي كتاب ليا
20500$ معدل الربح الشهري 0.375
كيف حسبه؟ أربعة و نص تقسيم اثنا عشر طلع 0.3
سبعة خمسة معدل الربح الشهري الرقم هذا الربح الشهري
يسمى معدل الربح الشهري ضرب الرصيد اللي هو عشرين
ألف و خمسمية تمام؟
اللي هو ربحه الشهري تمام 7687.5 ماشي يا جماعة طيب
هنا هيك عملنا الـ class الـ account اه لسه في حاجة
ما خلصناهاش السؤال بيقول
بيختلف عن السؤال اللي جاب له إنه طلب مني إن أعمل هذه
الحاجات private إيش يعني كلمة private بالانجليزي
يعني خاص الآن في مشكلة صغيرة أنا هنا عملت object
اسمه c1 من نوع account تمام عشان أحط بيانات للـ ID
إيش بعمل؟ c1.set_id صح و بحط القيمة اللي أنا بدي إياها
لكن في طريقة ثانية عشان أغير ال ID أنه ممكن أوصله
من غير ال set method أقول له ال dot و أحط ايش كلمة
ID مباشرة و أحط فيه القيمة اللي بدي إياها لـ ال ID هذا
متغير موجود جوا ال self من جوا ال class بأوصله لـ
self dot من برا ال class بأوصله باسم ال object dot
يعني أنا هنا وصلت لـ ال ID مباشرة من غير ما أستخدم
set ID بنفع ولا بنفعش؟ بنفع طبعًا هي متغير هذا مش
function متغير حطيت فيه القيمة هذه وممكن أوصل لـ
bank مباشرة لـ balance وأحط فيه قيمة مباشرة بدون
استخدام الـ set تمام؟
يعني أنا ممكن أوصل للمتغير بطريقة ثانية يا إما عن
طريق ال set وهذا الصح أو المفضل يا إما ممكن أوصل
للمتغير مباشرة أحط اسم المتغير balance مثلًا annual
interest rate اللي هو AIR وأحط فيه القيمة اللي
بدها، طيب ايش فرجوا عن بعض؟ أو ايش رأيكم؟ أنتم مين
أفضل أن أوصل للمتغير مباشرة والله أوصله من خلال
ال set method؟
ما هي الميزة مثلاً تتخربط هذه ما هو بتخربط في اسم
ال function برضه صح ولا؟ اه اللي أفضل أن أوصل من
خلال ال set method ليش؟ لأنه من خلال ال set method
بقدر أعمل type checking بمعنى أن أنا مثلاً مثلاً لو
جيت له setID ممكن داخل ال method setID أعمل فحص
أتأكد أن ال ID اللي دخله صحيح ولا لأ لو كان مش
صحيح يطلع لي error تمام؟
هذا بقدر أعمله في ال method set لكن بقدرش أعمله في
المتغير يعني هو لو في عندي وصول مباشر للمتغير
كأنني اتجوزت من ال set method يعني ال set method
هذا عامل زي الباب اللي بده يعدي، الباب هذا لازم
يخبط على الباب ويكون عنده مفتاح مثلًا صح؟ لكن أن
أوصل للمتغير مباشرة زي كده الواحد بيسيب بابه مفتوح
لأي حد يخش تمام الصح أن أوصل من خلال ال set method
لأنه ممكن من خلال ال set method أحط chicken زي
بالضبط ال withdraw ال method withdraw هذه فعليًا هي
بتغير على ايش يا جماعة؟ بتغير على ال balance صح ولا
لأ؟ الـ method with a draw فعليًا الهدف منها أن أغير
من ال balance أطرح منه قيمة تمام؟ ممكن أنا مباشرة
أجي عنده من هنا أقول له c1 ال balance اطرح لي منه 500
بنفع ولا مينفعش؟ بنفع تمام؟ بس هذا مش صح لأن ممكن
أنا أوصل لـ balance الموجود ما يغطيش المبلغ تمام؟
فده تعتبر ثغرة في ال code تبعي الصح أن أقول له
استخدم ال method
أستخدم الـ method withdraw لأن الـ withdraw فيها
checking في فحص يتم قبل أن يخصم من الـ balance
واضح يا جماعة؟ يعني الأفضل أن نستخدم الـ set و الـ
get أفضل أن نصل للمتغير مباشرة فهمنا الآن مين أفضل
طب كيف نمنع المستخدم أن يغير في قيمة ال variable
مباشرة و نجبره أن يستخدم ال set و ال get method؟
طبعًا أن نجعل المتغير private طب كيف نجعل المتغير
private؟ private معناه أن هذا المتغير غير
مسموح الوصول إليه مباشرة الوصول إليه بطريقة غير
مباشرة عن طريق مين؟ ال set method و ال get method
واضح اللي بحكيها يا جماعة؟ في وصول مباشر للمتغير
بالطريقة اللي شفناها قبل شوية اللي هو حط فيه واحد
واسم المتغير وغير قيمة ثابت ده، هذا وصول مباشر غير
مباشر عن طريق مين؟ ال set method و ال get method،
أنه نفذ ال set method و ال set method هي اللي
بتغير الميزة هنا أنه في ال set method ممكن أحط
checking أنه هل التغير هذا صح أو لأ؟ السؤال اللي
بدنا نقوله على الجد كيف نمنع المستخدم من الوصول
مباشر الحال أنه احنا نخل المتغير هذا من نوع
private من نوع خاص كيف نغلي من نوع خاص بمنطقة
البساطة كل اللي لازم أعمله أنه لأ كل ما يكون عندي
Dot .. وين المتغير بتتم إنشاءه فعليًا؟ عند .. مش
لما أقول له سلف Dot ID بروح بنشأه لما يكون عندك Dot
ID حط قبلها إشارة underscore زي كده تمام؟
أنا بهمني أتحط underscore هنا بهمني أتحط
underscore في الحاجة اللي بده ينشئها وين في ال self
وبرضه بتحط underscore هنا وهنا برضه بدها ايش بدها
underscore ولما أقول له set ID هذه بدها
underscore و get ID هنا بده underscore تمام؟ حجبها
نشوف ايش بتفرق هذه ال underscore و ال balance برضه
جابلها underscore و
هاي ال annual interest rate
الآن حطينا جملهم كلهم underscores الآن تعال اعمل
c1 و اعمل dot وحط اكتب كلمة ID مش هتشوفه أصلًا
تمام؟ ما بينش عندك في ايش؟ في القائمة جمل من غير
underscore كان يطلع عندنا تمام؟ حط balance بطل
يطلع عندي balance تمام؟ وكأنه ايش صار ايش صار
private بطل visible بطل المشاهد كيف خلته private؟
بس إن حطيت في ال self لما جيت أنشئ ال variable حطيت
underscore واضح يا جماعة عشان private تمام
هيك ممكن غطينا جزئية ال private
طيب هيك ممكن خلصنا الفصل زي ما قلت في homework رقم
واحد سؤال رقم اثنين وأربعة فكروا فيهم و
هفتح التسليم على ال moodle طيب لسه مخلصناش الآن يا
جماعة هندخل في آخر موضوع احنا هنشتغل فيه اللي هو
موضوع ال graphical user interface لحتى الآن
البرامج اللي احنا شغالين عليها كلها شغل من خلال الـ
command يعني اعمل لي input تخلي ال user يدخل يكتب
كلام بال input ويطلع له نتيجة لكن ما شفناش كيف
احنا نعمل برامج لها user interface وجهات وأزرار و
text books وغيره فبدنا نستفيد الآن من الشغل اللي
أخذناه سابقًا ومن الشغل ال object oriented اللي
غطناه بالمحاضرات السابقة عشان نعمل برامج لها وجهة
الـ Python بتوفر مكتبات مختلفة لتصميم الوجهات،
تمام؟ من ضمن المكتبات هذه، مكتبات يعني شفتوا أنتم
لما تعملوا import لـ class، تمام؟ وتستخدموها، هذه
مكتبة زي ال math مثلًا، تمام؟ هذه مكتبة فيها
functions كتير، بيستفيد منها الـ Python أيضًا بتوفر
مكتبات خاصة في الـ Graphical User Interface مش
هبدأ أنا في الموضوع اليوم بس بنا نقدم له ونفرجيكم
كيف نجهز الجهاز تبعنا على أساس نشغل عليه Graphical
User Interface لأن الإعدادات هذه بتاخد وقت من ضمن
ال libraries اللي موجودة في ال .. في ال Python فيه
library اسمها Tkinter تمام؟
Tkinter التكنتر ال library بيلت ان في ال python ايش
يعني built in في ال python يعني مضمنة أنا لما نزل
ال python بتيجي معاها ال library هذه وبنقدر
نستخدمها فيها كل ال components بتاعة ال user
interface زي مثلًا الأزرار ال combo box ال text
area ال text field وغيره والعام الماضي أنا لما
درست للطلاب درست على ال library هذه تمام إلا أن ال
library هذه شوية إمكانياتها محدودة يعني في أفضل
منها، الفصل هذا احنا نتعلم على library جديدة تمام
ومنتشرة أكثر من ال Tkinter اسمها ال πاي اكيوتي
يعني العام الماضي اشتغلوا على ال Tkinter وزي ما
أقول أن إمكانياتها محدودة شوي ولو أنها أسهل هي
المشروع على فكرة في الكتاب، يعني هذا فيه إلى فصل
بيشرحها في الكتاب تبعه، اللي احنا مش هنشرح الـ
Tekinter لأنه زي ما قلنا إمكانياتها بسيطة، هنطرق
لواحدة أفضل منها اسمها الـ Pi Qt Version 5 حطوا
خطين تحت five version five في version four تمام
وطلعت نسخة جديدة وهي version five آخر نسخة هي اللي
احنا هنتعلم عليها لكن مشكلة ال pyqt أنها مش built
in في ال python معناه أن احنا لازم نضيفها على ال
python عشان نستخدمها إذا احنا بنستخدم الـ PyCharm
ممكن أضيفها من خلال الـ PyCharm
كيف نضيفها من خلال الـ PyCharm؟ في
أسهل من هيك عشان نضيفها من خلال الـ PyCharm إذا
أنت بتستخدم الـ PyCharm بنروح على الـ File و بنروح
على Settings مرة
ثانية بروح على الـ File و بروح على قائمة Settings
وبعدين بروح على الـ Project Interpreter .. ال
Project Interpreter .. ما بعرفش يمكن الشاشة هذه مرت
عليكوا قبل هيك .. يعني أكيد اللي نزل الـ PyCharm
وحاول يربطها مع الـ Python .. مش أنتو كيف نزلتوا
.. بتنزلوا في الأول الـ Python لحال .. وبعدين
بتنزلوا الـ PyCharm .. وبعدين بدكم تربطوا الـ
PyCharm .. بالـ Python وعن طريق الشاشة هذه يعني
من هنا أنا بروح بختار وين الـ Python نزل عندي على
الجهاز طبعًا عنكم
غالبا الشاشة هذه حتكون فاضية أو فيها حاجة أو
حاجتين الآن بدنا نضيف Library جديدة اسمها PyQt
طبعًا كيف هنضيفها من إشارة الزائد هذه شايفين اللي
هنا بضغط عليها وهنا هيجيب لي عدد كبير جدا من الـ
Libraries اللي أنا ممكن أضيفها على الـ Python ال
Python لغة برمجة كبيرة جدا وله إضافات في مجالات
كتير تمام احنا بنضطر على إضافة واحدة اسمها PyQt5
تمام فكل المقال لازم أكتب PyQt5 تمام المفروض أنها
بتطلع عندي هي طبعًا أنا عندي طالع باللون الأزرق ليش
لأنه أنا ضفتها أصلا تمام فبعلم عليها وبقول له
Install Package طبعًا هذه بدها اتصال بالإنترنت
يعني بتستنى على الأربع ساعات اللي بتيجي أول ما
تيجي بتشغله تمام مش حتاخد وقت يعني دقيقتين بتكون
نازلة
ايش الفائدة منها هذه بعد ما أضيفها الفائدة أنه بعد
هيك أول ما أقول له Ok وأضيفها بقدر أجعل الـ Code
تبعي تمام وبقول له بعدين From PyQt5
شايفين طلعت عندي تمام طبعًا QtCore بدناش إياها هم
نتعلم لجديد PyQt5 بقول له Import مثلا QWidgets يعني
هذه اللي قال معناها أنها صارت شغالة إذا كتبت From
وما طلعش عندك لـ PyQt5 بيكون معناها فيه مشكلة
لسه طبعًا هذا إذا طلعت من ضمن الخيارات معناها إنها
شغالة أو تم إضافتها فعليًا للشغل تبعي هذا
بالنسبة لـ PyQt الحاجة الثانية بس بدها اتصال
بالإنترنت
طيب احنا ممكن اللي عملناه لحد الآن في الـ PyCharm
كافي لو أنا بدي اشتغل أصمم User Interface ككتابة
معايا أنتو؟ لكن احنا حابين يكون في طريقة نصمم
User Interface Drag and Drop تمام؟
ماذا سنتعلم بالظبط؟ أول محاضرة أو محاضرتين سنتعلم
في الـ Code ليس Drag and Drop لماذا؟ لأن فعليًا الـ
Drag and Drop سيطلع عندي Code بخم جدا تعالوا
تفهموا الـ Code هذا مش فاهمين طبعًا فاحنا بنبدأ
الأساسيات بنتعلمها كـ Code عشان تأخذوا فكرة عنها و
بعدين بنصير نعمل Drag and Drop هذه الطريقة الصحية
عشان نتعلمها لأن عشان نقدر نعمل Drag and Drop بدنا
ننزل حاجة Tool اسمها Python Anaconda Python
Anaconda هاي كتبت أنا بس عندي على الـ Google كتبت
Python Anaconda
تمام وبروح بنزل النسخة الخاصة بالويندوز تمام طبعًا
هينزلها عندي على الجهاز مش لازم أنا أعمل أي شيء
بعد
ما تنزل هذه طبعًا يعني يفضل تحط مسار أنت عارف هو
الموجود هو By Default بروح بخزنه في الـ App ومش
عارف وين في الـ Users يعني أغير المسار أحطه في مسار
أنت عارفه عشان تقدر توصله بعد ما تنزل الـ Anaconda
هذه يا جماعة بدي أروح على المجلد الخاص فيها هي أنا
نزلتها مثلًا أنا كنت في الـ H هي أنا كنت تلاتة تمام؟
وفي عندي
أه طيب جوا المجلد الخاص بالـ Anaconda هذا فيه مجلد
اسمه Library تمام جوا الـ Library لحظة
أشوف الـ Designer أه هي طيب مرة ثانية عشان ما
انتوا تنسوا ضفنا الـ PyQt5 على الـ PyCharm تمام؟ هذا
عشان أقدر أكتب Code تصميم الـ User Interface بالـ
Code إذا أنا بدأت أصمم عن طريق الـ Drag and Drop
بروح بنزل حاجة اسمها Python Anaconda بنزلها على
الجهاز بعدين بروح في المجلد الخاص بالـ Anaconda بفتح
مجلد
داخله اسمه Library وبعدين مجلد اسمه Lib تمام أنا
أكون دا بعدين Library بعدين Lib حتلاقي في ملف من
ضمن الملفات الكتيرة هذه اسمه Designer.exe
Designer أكتبوا حرف D هيطلع عندي إشارة الـ Designer
Application طبعًا إذا وصلتوله عشان مش كل شوية تروح
وتدخل المسار هذا حطوله Send To سطح المكتب كـ
Shortcut عملت له اختصار على سطح المكتب هي الـ Qt
Designer لأن أنا لو فتحت الـ Designer هذا فعليًا
هيفتح لي شاشة
بالصورة هذه بتقول له New مثلًا Main Window نافذة
جديدة وبصير أصمم من خلال Drag and Drop يعني هذا
مثلًا ايش؟ زر تمام؟ هذا هنا Check Box عارفين الـ
Tech؟ Check Box؟ هذا Radio Button تمام؟ وهكذا
هنتناول احنا الـ Components هذه تمام؟
بس في الأول طبعًا مش هنشتغل على هذا هنشتغل كـ Code
برمجة هاي الإعدادات اللازمة عشان احنا نشتغل أو
نبدأ في الـ Graphical User Interface مرة ثانية
بنضيف الـ PyQt5 على الـ PyCharm عن طريق الـ
Settings تمام وبروح بعمل على إشارة الزائد عشان
أضيفها وبعدين بنزل الـ Anaconda عشان أعتمد على الـ
Designer في التصميم ويعطيكم العافية