برمجةتدريبتعليمي

البرمجة كائنية التوجه (Object-Oriented Programming) في Python: برنامج تعليمي

البرمجة كائنية التوجه وجميع أساسياتها في Python، يمكننا التعامل معها من خلال: استكشاف الكلاسات، الكائنات، الطرق البديلة، والسمات وغيرها الكثير…

البرمجة كائنية التوجه (Object-Oriented Programming) هي مفهوم واسع الاستخدام لكتابة تطبيقات قوية.

باعتبارك عالِم بيانات، سيُطلب منك كتابة تطبيقات لمعالجة بياناتك، من بين مجموعة من الأشياء الأخرى.

سنكتشف في هذا البرنامج التعليمي أساسيات البرمجة كائنية التوجه في Python، وبالتالي سنتعلم ما يلي:

  • كيفية إنشاء كلاس (Class)
  • الكائنات الفورية (Instantiating objects)
  • إضافة سمات إلى الكلاس
  • تعريف طرق أو ميثودات داخل الكلاس
  • تمرير البارامترات إلى الميثودات
  • كيف يمكن استخدام OOP في Python للتمويل.

مقدمة عن البرمجة كائنية التوجه (OOP):

البرمجة كائنية التوجه لها بعض المزايا عن أنماط التصميم الأخرى، التطوير أسرع وأرخص، مع تحسين إمكانية صيانة البرمجيات.

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

يعد استخدام برمجيات OOP أبطأ وتستخدم ذاكرة أكثر نظراً لأنه يجب كتابة المزيد من أسطر التعليمات البرمجية.

تعتمد البرمجة كائنية التوجه على نموذج البرمجة الحتمي (imperative programming)، الذي يستخدم عبارات لتغيير حالة البرنامج.

حيث يركز على وصف كيفية عمل البرنامج، ومن أمثلة لغات البرمجة الحتمية (C، C++، Java، Go، Ruby، (Python.

هذا النموذج يتناقض مع البرمجة التعريفية (declarative programming)، والتي تركز على ما ينبغي أن يحققه برنامج الكمبيوتر، دون تحديد كيفية ذلك.

من الأمثلة على ذلك هي لغات استعلام قواعد البيانات مثل SQL و XQuery.

حيث يخبرنا جهاز الكمبيوتر فقط بالبيانات التي سيتم الاستعلام عنها من أين، ولكن الآن كيف يمكننا القيام بذلك.

يستخدم OOP مفهوم الكائنات والفئات ( Objects و Classes).

يمكن اعتبار الفئة “مخططاً” للكائنات، ويمكن أن يكون لها السمات الخاصة بهم (الخصائص التي يمتلكونها)، والأساليب (الإجراءات التي يقومون بها).

مثال عن البرمجة كائنية التوجه (OOP):

مثال للفئة أو الكلاس ولتكن الفئة هي فئة Dog (كلب).

لا تفكر في الأمر ككلب محدد، أو كلبك الخاص.

نحن نصف بشكل عام ما هو الكلب وما يمكنه القيام به.

الكلاب عادةً ما يكون لها اسم وعمر؛ هذه هي سمات على سبيل المثال، يمكن للكلاب أيضاً النباح. هذه طريقة أو ميثود.

إذاً عندما تتحدث عن كلب معين، سيكون لديك كائن في البرمجة: الكائن عبارة عن إنشاء مثيل للفئة.

هذا هو المبدأ الأساسي الذي تعتمد عليه البرمجة كائنية التوجه.

لذلك كلبي Ozzy، على سبيل المثال، ينتمي إلى فئة الكلب.

سماته هي ‘name = ‘Ozzy و ‘age = ‘2.

كلب مختلف سيكون له صفات مختلفة.

البرمجة كائنية التوجه في Python:

البرمجة كائنية التوجه في Python

Python هي لغة برمجة رائعة تدعم OOP، سوف نستخدمها لتعريف الكلاس مع السمات والأساليب، والتي سنستدعيها فيما بعد.

تقدم Python عدداً من الفوائد مقارنةً باللغات البرمجية الأخرى مثل Java أو ++C أو R.

فهي لغة ديناميكية تحتوي على أنواع بيانات عالية المستوى، هذا يعني أن التطور يحدث بشكل أسرع من Java أو ++C.

لا يتطلب من المبرمج أن يعلن عن أنواع المتغيرات والبارامترات.

هذا أيضاً يجعل Python أسهل في الفهم والتعلم للمبتدئين، حيث يكون كودها أكثر سهولة في القراءة وبديهية أيضاً.

كيفية إنشاء كلاس (Class):

لتعريف فئة أو كلاس في Python، يمكنك استخدام الكلمة الأساسية للكلاس، متبوعةً باسم الكلاس ونقطتين.

داخل الكلاس، يجب تعريف ميثود __init__ مع def.

هذا هو المُهيئ الذي يمكنك استخدامه لاحقاً لإنشاء كائنات، وهي مشابهة للباني في Java.

ميثود __init__ يجب أن تكون موجودة دائماً! تأخذ بارامتر واحد: self، والذي يشير إلى الكائن نفسه.

داخل الميثود، يتم استخدام الكلمة الأساسية pass اعتباراً من الآن، لأن Python تتوقع منك كتابة شيء ما هناك.

تذكر دوماً استخدام المسافة البادئة الصحيحة!

class Dog:

    def __init__(self):
        pass

ملاحظة: self في Python تعادل this في ++C أو Java.

في حالتنا هذه، لديك فئة الكلب (معظمها فارغة)، ولا يوجد أي كائن حتى الآن، دعونا ننشئ واحدة!

الكائنات الفورية (Instantiating objects):

لإنشاء كائن، اكتب اسم الكلاس، متبوعاً بقوسين، ويمكنك إسناد هذا إلى متغير لتتبع الكائن.

ozzy = Dog()

نقوم بطباعته:

print(ozzy)
<__main__.Dog object at 0x111f47278>

إضافة سمات إلى الكلاس:

بعد طباعة ozzy، من الواضح أن هذا الكائن هو كلب، ولكنك لم تضف أي سمات حتى الآن.

دعونا نعطي فئة الكلب اسماً وعمراً، عن طريق إعادة كتابتها:

class Dog:

    def __init__(self, name, age):  
        self.name = name
        self.age = age

يمكنك أن ترى أن الدالة تأخذ الآن بارامترات بعد self: وهما name و age، ومن ثم أسندناهما إلى self.name و self.age على التوالي.

يمكنك الآن إنشاء كائن ozzy جديد، مع اسم وعمر:

ozzy = Dog("Ozzy", 2)

للوصول إلى سمات كائن في Python، يمكنك استخدام ترميز النقطة. حيث يتم ذلك عن طريق كتابة اسم الكائن، متبوعاً بنقطة واسم السمة.

print(ozzy.name)

print(ozzy.age)
Ozzy
2

يمكن أيضاً دمج ذلك في جملة أكثر تفصيلاً:

print(ozzy.name + " is " + str(ozzy.age) + " year(s) old.")
Ozzy is 2 year(s) old.

يتم استخدام الدالة ()str هنا لتحويل سمة العمر، وهي عدد صحيح، إلى سلسلة، بحيث يمكنك استخدامها في الدالة ()print.

تعريف طرق أو ميثودات داخل الكلاس:

الآن بعد أن حصلت على فئة الكلب، كان لديه اسم وعمر يمكنك تتبعه، ولكنه لا يفعل أي شيء في الواقع.

هذا هو المكان الذي تأتي منه طرق بديلة، حيث يمكنك إعادة كتابة الفئة لتتضمن الآن طريقة النباح ()bark.

لاحظ كيف يتم استخدام الكلمة الأساسية def مرة أخرى، فضلاً عن الوسيط self.

class Dog:

    def __init__(self, name, age):  
        self.name = name
        self.age = age

    def bark(self):
        print("bark bark!")

يمكن الآن استدعاء أسلوب النباح باستخدام التدوين النقطي، بعد إنشاء كائن جديد منسجم.

يجب أن تطبع الطريقة “bark bark! ” على الشاشة.

لاحظ الأقواس (الأقواس المتعرجة) في ()bark. وتستخدم هذه دائماً عند استدعاء طريقة.

هي فارغة في هذه الحالة، نظراً لأن ميثود ()bark لا تأخذ أي بارامترات.

ozzy = Dog("Ozzy", 2)

ozzy.bark()
bark bark!

تذكر كيف طبعت ozzy في وقت سابق؟

التعليمات البرمجية أدناه تطبق الآن هذه الدالة في كلاس Dog، باستخدام ميثود ()doginfo.

ثم قم بإنشاء بعض الكائنات ذات الخصائص المختلفة، وقم باستدعاء الميثود عليها.

class Dog:

    def __init__(self, name, age):  
        self.name = name
        self.age = age

    def bark(self):
        print("bark bark!")

    def doginfo(self):
        print(self.name + " is " + str(self.age) + " year(s) old.")
ozzy = Dog("Ozzy", 2)
skippy = Dog("Skippy", 12)
filou = Dog("Filou", 8)
ozzy.doginfo()
skippy.doginfo()
filou.doginfo()
Ozzy is 2 year(s) old.
Skippy is 12 year(s) old.
Filou is 8 year(s) old.

كما ترون هنا، يمكنكم استدعاء ميثود ()doginfo على الكائنات باستخدام التدوين النقطي.

تعتمد الاستجابة الآن على كائن Dog الذي تقوم باستدعاء الميثود عليه.

بما أن الكلاب تتقدم في السن، سيكون من الرائع إذا كان بإمكانك تعديل أعمارهم وفقاً لذلك.

تحول Ozzy إلى 3، لذا دعنا نغير عمره.

ozzy.age = 3
print(ozzy.age)
3

الأمر سهل مثل تعيين قيمة جديدة للسمة، يمكنك أيضاً تنفيذ هذا كميثود عيد ميلاد ()birthday في فئة الكلب:

class Dog:

    def __init__(self, name, age):  
        self.name = name
        self.age = age

    def bark(self):
        print("bark bark!")

    def doginfo(self):
        print(self.name + " is " + str(self.age) + " year(s) old.")

    def birthday(self):
        self.age +=1
ozzy = Dog("Ozzy", 2)
print(ozzy.age)
2
ozzy.birthday()
print(ozzy.age)
3

لا تحتاج الآن إلى تغيير عمر الكلب يدوياً، كلما كان عيد ميلاده، يمكنك فقط استدعاء ميثود ()birthday.

تمرير البارامترات إلى الميثودات:

هل تريد أن يكون للكلاب صديق؟ يجب أن يكون هذا اختيارياً، نظراً لأن كل الكلاب ليست محبة للاختلاط.

ألق نظرة على ميثود ()setBuddy أدناه.

تأخذ self، كما هو معتاد، وbuddy (صديق) كبارامترات.

في هذه الحالة، سوف يكون buddy كائن Dog آخر.

نقوم بضبط السمة self.buddy إلى buddy، والسمة buddy.buddy إلى self.

هذا يعني أن العلاقة متبادلة، أنت رفيق صديقك.

في هذه الحالة، سيكون Filou صديق Ozzy، مما يعني أن Ozzy يصبح تلقائياً صديق Filou.

يمكنك أيضاً تعيين هذه السمات يدوياً، بدلاً من تعريف ميثود، ولكن ذلك يتطلب المزيد من العمل (كتابة سطرين من الشفرة بدلاً من 1) في كل مرة تريد فيها تعيين صديق.

لاحظ أنه في Python، لا تحتاج إلى تحديد نوع الوسيط أو البارامتر، بينما إذا كنت تتعامل مع Java، فستكون مطلوبة.

class Dog:

    def __init__(self, name, age):  
        self.name = name
        self.age = age

    def bark(self):
        print("bark bark!")

    def doginfo(self):
        print(self.name + " is " + str(self.age) + " year(s) old.")

    def birthday(self):
        self.age +=1

    def setBuddy(self, buddy):
        self.buddy = buddy
        buddy.buddy = self

يمكنك الآن استدعاء الميثود باستخدام النقطة، وتمريرها ككائن Dog آخر.

في هذه الحالة، سيكون Filou صديق Ozzy:

ozzy = Dog("Ozzy", 2)
filou = Dog("Filou", 8)

ozzy.setBuddy(filou)

إذا أردت الآن الحصول على بعض المعلومات عن صديق Ozzy، يمكنك استخدام النقطه مرتين:

  • أولاً، للإشارة إلى أصدقاء Ozzy.
  • مرة ثانية للإشارة إلى صفته.
print(ozzy.buddy.name)
print(ozzy.buddy.age)
Filou
8

لاحظ كيف يمكن القيام بذلك أيضاً من أجل Filou.

print(filou.buddy.name)
print(filou.buddy.age)
Ozzy
2

يمكن أيضاً استدعاء ميثودات الأصدقاء.

البارامتر self الذي تم تمريره كوسيط لـ ()doginfo هو الآن ozzy.buddy، وهو filou.

ozzy.buddy.doginfo()
Filou is 8 year(s) old.

مثال: البرمجة كائنية التوجه في Python للتمويل:

مثال عن المكان الذي يمكن أن تكون فيه البرمجة كائنية التوجه في Python سهلة الاستخدام.

هو برنامج Python For Finance: برنامج التداول الخوارزمي التعليمي.

يشرح Karlijn فيه كيفية إعداد استراتيجية تداول لمحافظ الأوراق المالية.

تعتمد استراتيجية التداول على متوسط تحرك سعر السهم.

إذا تحقق الشرط التالي:

[:signals[‘short_mavg’][short_window:] > signals[‘long_mavg’][short_window

عندها يتم إنشاء إشارة، هذه الإشارة هي توقع لتغير سعر السهم في المستقبل.

في التعليمة البرمجية أدناه، أولاً سترى أن هناك أولوية، متبوعة بحساب متوسط التحرك وتوليد الإشارة.

نظراً لأن هذا ليس كوداً كائني التوجه، فهو مجرد جزء كبير يتم تنفيذه دفعة واحدة.

لاحظ أننا نستخدم aapl في المثال، وهو مؤشر أسهم Apple.

إذا كنت تريد القيام بذلك لأسهم مختلفة، يجب عليك إعادة كتابة التعليمات البرمجية.

# Initialize
short_window = 40
long_window = 100
signals = pd.DataFrame(index=aapl.index)
signals['signal'] = 0.0

# Create short simple moving average over the short window
signals['short_mavg'] = aapl['Close'].rolling(window=short_window, min_periods=1, center=False).mean()

# Create long simple moving average over the long window
signals['long_mavg'] = aapl['Close'].rolling(window=long_window, min_periods=1, center=False).mean()

# Create signals
signals['signal'][short_window:] = np.where(signals['short_mavg'][short_window:] > signals['long_mavg'][short_window:], 1.0, 0.0)   

# Generate trading orders
signals['positions'] = signals['signal'].diff()

# Print `signals`
print(signals)

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

يمكنك بعد ذلك إنشاء كائن جديد لكل سهم تريد حساب استراتيجية عليه، واستدعاء ميثود ()generate_signals عليه.

لاحظ أن كود OOP يشبه إلى حد كبير الكود أعلاه، مع إضافة self.

class MovingAverage():

    def __init__(self, symbol, bars, short_window, long_window):
        self.symbol = symbol
        self.bars = bars
        self.short_window = short_window
        self.long_window = long_window

    def generate_signals(self):
        signals = pd.DataFrame(index=self.bars.index)
        signals['signal'] = 0.0

        signals['short_mavg'] = bars['Close'].rolling(window=self.short_window, min_periods=1, center=False).mean()
        signals['long_mavg'] = bars['Close'].rolling(window=self.long_window, min_periods=1, center=False).mean()

        signals['signal'][self.short_window:] = np.where(signals['short_mavg'][self.short_window:] > signals['long_mavg'][self.short_window:], 1.0, 0.0)   

        signals['positions'] = signals['signal'].diff()   

        return signals

يمكنك الآن ببساطة إنشاء كائن، باستخدام البارامترات التي تريدها، وإنشاء إشارات لها.

apple = MovingAverage('aapl', aapl, 40, 100)
print(apple.generate_signals())

يصبح القيام بذلك من أجل سهم آخر أمراً سهلاً للغاية، فهي مجرد مسألة إنشاء كائن جديد برمز سهم مختلف.

microsoft = MovingAverage('msft', msft, 40, 100)
print(microsoft.generate_signals())

خلاصة البرمجة كائنية التوجه في Python:

الآن قد تعرفنا كيفية التصريح عن الفئات (Classes) والطرق (Methods)، وإنشاء كائنات، وتعيين سماتها وطريقة استدعاء الميثود.

هذه المهارات سوف تأتي في متناول اليد خلال حياتك المهنية المستقبلية كعالم بيانات.

مع البرمجة كائنية التوجه (OOP)، سيزداد تعقيد الكود الخاص بك مع زيادة حجم البرنامج.

بالتالي سيكون لديك فئات مختلفة، فئات فرعية، كائنات، ووراثة، وطرق بديلة، وأكثر من ذلك.

ستحتاج إلى الاحتفاظ بكودك منظم بشكل صحيح وقابل للقراءة. للقيام بذلك، ينصح باتباع أنماط التصميم (design patterns).

سنقوم لاحقاً بتخصيص مقالة حول أنماط التصميم.

 

مرجع المقالة من هنا.

 

نبذة عن الخطة الشاملة

نسعى دوماً لتزويد متابعينا بأفضل المعلومات و البرامج والتطبيقات والنصائح الهامة، كما نعمل دائماً على توجيه المتابعين وخاصة المبرمجين إلى المسار الصحيح.

لذلك نود إعلامكم بالخطة الشاملة، بإشراف المدرب المحترف الأستاذ أحمد ناصر، حيث تحتوي على مزايا لم تتخيلوا وجودها في دورة تدريبية.

الموقع الرسمي للخطة والتسجيل من هنا:

http://khottah.com/

التسجيل عبر رابط الخطة مع خصم 50% من هنا:

http://khottah.com/?coupon_code=50off

لمعرفة منهاج الخطة من هنا:

https://anbilarabi.com/curriculum

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

https://anbilarabi.com/payments

يمكنكم تحميل البروشور الخاص بالخطة من هنا:

https://d1y0l0iz92xzfv.cloudfront.net/khottah-brochure.pdf

شرح صوتي عن الخطة في 5 دقائق:

https://soundcloud.com/anbilarabi/5a-1

الدليل الشامل حول الخطة بالفيديو تعرف على الخطة من الداخل:

https://youtu.be/Oqi8Dp1KgH4

أخيراً نود مشاركتكم  بعض ما قاله البعض عنا وعن الخطة الشاملة وتقييمات الطلاب عبر هذا الرابط:

https://anbilarabi.com/people

شكراً جزيلاً لكم ولا تترددوا بالتواصل معنا عن طريق الواتس آب للرقم 00970599042502

كما يمكنكم مراسلتنا عبر هذا الإيميل:

http://ahmadnaser.com

 

 

 

 

 

 

 

 

 

تفضيل
زر الذهاب إلى الأعلى
رجوع
00970599042502
WhatsApp
Telegram
Messenger
البريد الإلكتروني
Live Chat
الاستشارات المباشرة
جميع الدورات
خدمات شركتنا
الدعم الفني
تحتاج مساعدة تواصل معي واتساب