لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 10/09/18 في كل الموقع
-
السلام لجميعكم كنت عايز فكرة مشروع مربح ولا يهم كم تكلفة انشائه ؟1 نقطة
-
بما أنك صاحب شركة خدمية، فلا بدّ أنك تبحث دومًا عن طرق لجذب وبناء الثقة مع العملاء والزبائن. للأسف، فإن الكمية الضخمة للمصادر المتنافسة على الإنترنيت قد تجعل من الصعب عليك أن تبرز من بين الجّميع. ومن دون استراتيجية قوية، قد يصعب عليك الحصول على من يرى رسالتك ويثق بها من جمهورك المستهدف. إنما لحسن الحظ، يمكن للتدوين المُستضاف أن يكون وسيلة رائعة لتحسين مستوى كلٍ من رؤيتهم لك والثقة بك. إذا كان جمهورك يثق بالفعل في المدونة/موقع الويب الذي تدون فيه كُمستضاف، فيمكنك استخدامه لإنشاء قاعدة من العملاء المحتملين بسرعة وفعالية. ومع ذلك، ستحتاج -لتكون ناجحًا- للبحث بشكل صحيح عن المواضيع، وترويج أفكارك بالشكل الملائم، إلخ.. سنرشدك في هذه المقالة إلى أربع خطوات ستساعدك في إنشاء استراتيجية فعالة للتدوين المُستضاف. هيا بنا نبدأ: الخطوة 1: قمّ بأبحاث موضوعية وشاملة: تُعدّ فكرة تدوينتك إحدى العوامل الرئيسية التي تحدد ما إذا كان موقع الويب سيختارك كمدون مُستضاف لديه. من أجل جذب انتباه صاحب الموقع، ستحتاج إلى التوصل إلى فكرة قوية تجذب الجمهور المستهدف للموقع. إذا لم يلامس موضوعك قراء المدونة، فمن المحتمل أن يتم تجاهل طلبك للتدوين المُستضاف. باختصار، يجب أن تأخذ ما يبحث عنه القراء عند قراءة تدوينتك بعين الاعتبار. قد تكون لديك فكرة أو موضوع معين تريد الكتابة عنه، إلا أنه إذا لم يشاركك القراء نفس الاهتمام، فلن تجذب انتباههم بشكلٍ كبير. يجب أن يبدأ بحثك عن الموضوع عن طريق محاولة فهم المشكلات التي يواجهها جمهورك، والأسئلة التي لا يمكن العثور عليها، أو المعلومات غير المتوفرة على الإنترنت. يمكنك البدء في إجراء أبحاث حول المواضيع التي قد تثير اهتمام جمهورك من خلال البحث على الشبكات الاجتماعية أو تصفح المنتديات أو حتى من خلال تعليقات موقعك لمعرفة الأسئلة التي يطرحها عملاؤك (الحاليين والمحتملين). ويمكن لدراستك لمنافسيك، ومراجعة المواضيع التي يتناولونها، وما يبحث عنه جمهورهم، أن يمنحك أيضًا صورة عن مواطن القصور في المحتوى التي يمكنك سدّها. الخطوة 2: البحث عن المدونات التي تلبي احتياجات جمهورك المُستهدف: بعد إعداد أفكار للمواضيع التي تستهدف جمهورك المستهدف، ستحتاج للعثور على المدونات المناسبة لنشرها. وهذا يعني أنك بحاجة إلى تحديد المدونات التي يتفاعل معها جمهورك المستهدف، ومن ثم تحديد أيّها قد يكون مهتمًا بالمواضيع التي أعددتها. جمهور المدونات التي تروّج فيها مهم للغاية. إن كنت تنشر محتواك في موقع ويب لا يثق فيه جمهورك أو يتفاعل معه، فإنك تضيع وقتك فحسب. بينما إذا كان عملاءك المستهدفين يزورون المدونة التي تحاول نشر تدوينتك المُستضافة فيها بشكل دوري، حينها يمكن لتدوينتك جذب انتباههم. نظرًا لأنهم يثقون بالفعل بموقع الويب المعني، وبالتالي سيثقون بك أنت أيضًا. للعثور على المدونات التي يثق بها جمهورك المستهدف، يمكنك البدء من خلال الاطلاع على صفحات عملاءك الحاليين على مواقع التواصل الاجتماعي وتصفح المواقع ذات الصّلة بموقعك. راجع من يُولُونَه اهتمامهم، وركزّ بمن يعتقدون بأنهم رواد مجالك. يمكنك استخدام هذه المعلومات لإنشاء قائمة بالمدونات التي يمكنك التدوين المُستضاف فيها. ويعدّ من الذكاء أيضًا أن تبحث عن المواقع الشهيرة التي تقبل التدوين المُستضاف بصورة منتظمة، لمعرفة ما إذا كان أيّ منها يناسبك. الخطوة 3: خطط لعرضك التقديمي أولًا: كل ما قمت به حتى الآن هو الإعداد لخطوتك الأولى. فحتى مع فكرة الموضوع المثالي والمدونة المستهدفة الصحيحة، ربما لن تستطيع ضمان أن يتم نشر تدوينتك المستضافة إن لم يكن عرضك لها بحدّ ذاته قويًا. للحصول على موافقة من مالك المدونة، ستحتاج لتقديم عرضك بقوة. العرض التّقديمي هو مجرد شرح لفكرة التّدوينة. وضمنه ستحتاج إلى شرح فكرة تدوينتك، وبعض النقاط الرئيسية التي ترغب في الإشارة إليها، ولماذا تعتقد أن التّدوينة ستكون وثيقة الصلة بقراء المدونة الّتي تستهدفها. ولا تحتاج -في تقديم عرضك بنجاح- لإرسال التدوينة كاملةً، ما لم يطلب القائمون على الموقع ذلك. إذا كان للمدونة التي تقدم عرضك لها شروط بشأن التدوينات المستضافة المدرجة عليها، فتأكد من اتباع كل منها بدقة. بالنسبة للمواقع التي لا تحدد كيفية إرسال المشاركات، ابدأ بالتعريف بنفسك وذكر مؤهلاتك. أخبرهم بما تريد الكتابة عنه، ولماذا تعتقد أنه موضوع مهم بالنسبة إلى جمهورهم، وما تريد تغطيته في التدوينة. قبل كل شيء، قم بتجهيز عرضك بعناية، وقم بتوضيح كيف أن تدوينتك المستضافة ستفيد الموقع وزواره. الخطوة 4: اصنع خطة ترويجية: لا ينتهي عملك كمدون مُستضاف بمجرد الحصول على موافقة من صاحب الموقع. وحتى بعد كتابة تدوينتك والموافقة عليها ونشرها، لا يزال يتعين عليك التأكد من معرفة جمهورك المستهدف بها. لجذب عملاء جدد، عليك إنشاء خطة تسويقية مع صاحب المدونة، للمساهمة في جذب الانتباه لمحتواك. تأكد من مناقشة توقعاتك التسويقية قبل صياغة التدوينة المستضافة ونشرها. وبما أن هدفك هو جذب عملاء جدد من خلال الاستفادة من جمهور الموقع، فإنك تريد التأكد من أن المحتوى سيحظى بالاهتمام الذي يستحقه. اسأل صاحب المدونة عن كيفية الترويج للتدوينات المُستضافة، ولكن عليك أيضًا معرفة ما إذا كان يتوقع أي نوع من الترويج من قِبلك. يجب أن تكون الاستراتيجية التي تقوم بإنشائها مفيدة لكلا الطرفين. أفضل طريقة لترويج تدوينتك المستضافة هي على صفحاتك في مواقع التواصل الاجتماعي. يمكنك جذب الانتباه بشكلٍ أكبر باستخدام اسم/وسم الموقع للمساهمة في جذب جمهوره. يجب عليك أيضًا التعامل مع التعليقات حول تدوينتك، والإجابة على الأسئلة وحتى الردّ على النقد. يمكن أن يساعد هذا في تعزيز المشاركة والاستفادة القصوى من تدوينتك المُستضافة. الخلاصة: تعد إستراتيجية التدوين المُستضاف الفعالة طريقة رائعة لزيادة ثقة جمهورك المستهدف وجذب العملاء الجدد المحتملين. ومع ذلك، إذا كنت تريد لتدوينتك المُستضافة أن تكون ناجحة، فلا بد أن تكون مُعدّة بشكل جيد، ومصممة لتلبية احتياجات القارئ، ومنصبّة على المواضيع الصحيحة. لنلخص الخطوات الأربع التي ستحتاج إلى اتباعها لإنشاء استراتيجية ناجحة للتدوين المُستضاف: قم بإجراء أبحاث موضوعية شاملة لمعرفة جمهورك المستهدف، وكوّن -بناءً على النتائج- أفكارًا لتدويناتك. ابحث عن المدونات/المواقع التي يملكها المؤثرين في مجال عملك، ويزورها جمهورك المستهدف بشكلٍ مستمر. طوّر عرضًا قويًا، بما في ذلك موضوعك المقترح ومؤهلاتك. اصنع خطة ترويجية لزيادة تسليط الضوء على تدوينتك المُستضافة. كيف تعتقد أن التدوين المُستضاف سيفيد نشاطك التجاري؟ أخبرنا بذلك في التعليقات! ترجمة -وبتصرّف- للمقال How to Use Guest Blogging to Attract New Clients (4 Simple Steps) لصاحبه Tom Ewer1 نقطة
-
تصميم في قمة الإمتياز , أنا اعرف انكسكيب من سنوات طويلة لكن لم افكر ابداء في ضناعة تصاميم إحترافية مشابهة .1 نقطة
-
1 نقطة
-
سواء كنا ندرك ذلك أم لا، فإننا دائمًا نقوم بتقديم أو استقبال التعليقات والتغذية الراجعة. أحيانًا يتم الأمر بشكل صريح، كما هو الحال في اجتماع شخصي مثلًا، أو يتم بشكل ضمني، من خلال نبرة الصوت ولغة الجسد. قد لا ندرك الصورة التي نقدمها، لذلك فإننا بحاجة لأن نضع ذلك الأمر بعين الاعتبار. إن التغذية الراجعة الخاصة بالموظف هي محور التطوير الشخصي والمهني. كما يمكن أن تحسن أداء الموظف أو سلوكه داخل الفريق بشكل ملحوظ. ولكن تقديم تغذية راجعة فعّالة وذات أهمية يمكن أن تكون عملية صعبة بعض الشيء. ومن أجل ذلك السبب قمنا بوضع قائمة من التعليقات والتغذية الراجعة التي يمكن أن تساعدك في حياتك يوميًا بالإضافة لبعض النصائح التي يمكنك استخدامها مباشرةً. أمثلة عن تغذية راجعة تم تقديمها بشكل ملائم للموظفين فيما يلي مجموعة من الأمثلة يمكنك البدء في استخدامها مع الموظفين اعتبارًا من اليوم. 1. إذا بدا الموظف منفصلًا أو مستقلًا بذاته إذا كان أحد الموظفين مستقلًا بذاته، فيجب أن تعلم فيما إذا كان هناك أي شيء يزعجه، لذلك فإنك بحاجة إلى: تبيّن له أنك تلاحظه / وتبحث عنه أخبره كيف تشعر حيال الأمر اعرض تقديم المساعدة إليك ما يمكنك قوله: لاحظت بأنك لا تبدو سعيدًا كما هي عادتك، ومن الواضح أن ذلك يجعلني أشعر بأني أقوم بأمر خاطئ. هل كل شيء على ما يرام؟ أعتقد أننا إذا اجتمعنا مرة كل أسبوع للتأكد من أن كل شيء على ما يرام، ستكون أكثر سعادة. 2. إذا لم يقدم أحد الموظفين مشروعًا في الوقت المحدد في حين أن هذا الأمر قد يكون مخيبًا للآمال، لكن ليس هناك ما يمكن القيام به حياله. ليس هناك فائدة من الغضب، فقط تأكّد من أن الأمر لن يتكرر مرة أخرى. يجب أن يكون الجميع مسؤولين عن عملهم، لذا فعند تقديم التغذية الراجعة بشأن الموضوع فإنك بحاجة إلى: تسليط الضوء على أهمية الأمر تحفيزهم للمرة القادمة تقديم أفكار للتطوير إليك ما يمكنك قوله: لم يتم تسليم المشروع في الوقت المحدد، هل لديك فكرة عن السبب؟ كما تعلم إننا نحاول تنظيم كل شيء للموقع الجديد، لذا فإن تأخيرك في تسليم المشروع سيبطئ من عمل بقية الفريق. سنقوم فقط بالتأكد من أنه بالنسبة للمشروع التالي، فإنك تمتلك المزيد من الوقت والموارد لإنهائه حسب الخطة. سيكون الموقع الجديد عظيمًا! وأخيرًا، كل ما يمكنك فعله هو جدولة عملك مسبقًا، ربما يوم واحد في الأسبوع كافي للتأكد من أنك لا تترك الكثير من الأعباء للنهاية. قمت بتجربة ذلك على مشروعي الأخير، وقد أحدث فرقًا كبيرًا. 3. إذا ارتكب أحد الموظفين خطأً مع العميل لابد من حدوث بعض الأخطاء، ولكن يجب أن تقوم بما في وسعك للتأكد من عدم تكرار الأمر مرة أخرى، فالعملاء على غاية من الأهمية. عند تقديم تغذية راجعة بشأن هذا الموضوع، فإنك بحاجة للتحدث بالتفاصيل التي توضح ما حدث حتى يكون الموظفين جاهزين بشكل أفضل: قل لهم بأنه لا داعي للقلق حيث يمكن إصلاح الأمر اشرح لهم الظروف حتى يدركوا ذلك في المرة القادمة اعرض تقديم مساعدة إليك ما يمكنك قوله: ليست نهاية العالم، ولكن تذكر في المرة القادمة أن تقوم بتحديث معلومات فواتيرهم قبل أن ترسل لهم مفتاح الوصول. إن الطريقة التي يعمل بها رقم مفتاح الدخول تعتمد على معلومات الفواتير، لذا فإنها هامة للغاية. ولكن لا تقلق، سنرسل لهم اعتذار عبر رسالة بالبريد الإلكتروني وسنقوم بذلك يدويًا الآن. إن كنت ترغب بتخصيص بعض الوقت للاطلاع على كيفية عمل البرنامج، فإني سأكون سعيدًا بمساعدتك، لا مشكلة بذلك. مدير يقدم تغذية راجعة لأحد الموظفين. 4. إذا كان الموظف وقحًا مع أحد زملاء العمل من الناحية المثالية، جميع من في الفريق يعملون معًا بشكل جيد ويتعاونون بسلاسة، ولكن حدوث التوتر بين زملاء العمل هو أمر طبيعي يحدث في كثير من الأحيان. ويجب عليك أن تضع حدًا للأمر حين حدوثه وبسرعة. اشرح له لماذا تتحدث معه وليس مع زميل العمل لا تلقِ باللوم عليه، بل استمع إليه قم بتقديم النصيحة إليك ما يمكنك قوله: لقد طلبت مني ستايسي أن أتحدث معك بخصوص ما قلته في وقت سابق، ولا أعتقد أنها ستشعر بالراحة عند الحديث بالأمر لذلك فإني عرضت القيام بذلك. لدي بعض الفضول، هل يمكن أن تشرح لي ما حدث؟ إنني أفترض بأن الأمر كان عبارة عن سوء فهم، ولكن بالطبع أريد من الجميع أن يقوم بتصحيح ذلك الأمر. لو كنت أنا من قام بذلك، كنت سأنتظر حتى نهاية اليوم ثم أعتذر منها، وربما سأطلب منها الذهاب لتناول الغداء معًا للحديث عن الموضوع. 5. إذا كان الموظف لا يتعاون مع أي شخص يعتبر هذا الوضع أكثر إثارة للقلق بعض الشيء، ولكن مرة ثانية، عليك أن تركز على السلوك بدلًا من الشخص. كن واضحًا قم بتقديم أفكار لحل المشكلة إليك ما يمكنك قوله: أردت فقط أن أخبرك بأني تلقيت مؤخرًا بعض الشكاوى من بعض الأشخاص في الفريق بشأن هذا الموضوع. كنت أرغب بالتحدث معك مباشرةّ بشأن ذلك الموضوع لمعرفة فيما إذا كان هناك أي شيء يمكننا القيام به. قد يكون السبب في حدوث ذلك أنك كنت متوترًا، ولكني أعتقد بأنك عندما ترفع صوتك أحيانًا فإنك تجعل الناس يفكرون بأسلوبك بطريقة خاطئة، وقد يكون هو السبب في اعتقادهم بأن تصرفك كان وقحًا. إني أتساءل فيما إذا كان العمل من المنزل ليوم واحد في الأسبوع قد يساعدك بالتخفيف من بعض التوتر الذي تشعر به. 6. إذا لم يحدد الموظف أهدافًا جيدة إنه لأمر صعب، لأنك لا تريد أن تثبط عزيمتهم، فقد يكونوا غاضبين بما يكفي لأنهم لم يحققوا أهدافهم. تذكر: كن إيجابيًا قم بتحديد الأمور بشأن ما يمكنهم القيام به بشكل أفضل إليك ما يمكنك قوله: لقد قمت بعمل رائع فيما يتعلق بأهدافك هذا الربع من العام. لا بأس إن لم تحقق جميع الأهداف، فأنا أعتقد بأننا نستطيع أن تكتشف ما الذي يساعدك على العمل بشكل أفضل. وأعتقد أن أهدافك كانت بحاجة لكثير من العمل، وفي المرة القادمة سأقوم بتحديد هدفين فقط بدلًا من 5 أهداف. بهذه الطريقة، ستكون قادرًا على التركيز حصرًا على هذين الهدفين. 7. إن لم يكن الموظف مبادرًا عندما تقدم تغذية راجعة بشأن هذا الموضوع، تذكر: أخبره بمدى تأثيره عليك قم بتقديم المساعدة والنصيحة إليك ما يمكنك قوله: لاحظت بأنك لا تأخذ زمام المبادرة كما كنت تقوم سابقًا. إن هذا الأمر يجعلني أشعر بأني قمت بشيء خاطئ. هل قلت أو قمت مؤخرًا بما يزعجك؟ اثنين من زملاء العمل يتبادلان التغذية الراجعة 8. إذا كان الموظف يعاني من مشكلة في إدارة الوقت من الصعب اكتساب القدرة على إدارة الوقت بسهولة، فهي عملية مستمرة من التطوير الدائم، ولكن في حال تحول الأمر لمشكلة حقيقة، عليك أن تقدم له بعض الملاحظات. عندما تقدم تعليقات أو تغذية راجعة بشأن هذا الأمر، تذكر: أخبره كيف يؤثر ذلك على الفريق اعرض عليه تقديم النصائح إليك ما يمكنك قوله: لقد لاحظت بأنك لم تكن قادرًا على إدارة وقتك للمهام الثلاثة الماضية. لم يتمكن بعض الأشخاص الآخرين في الفريق من إنجاز عملهم، الأمر الذي أدى لظهور بعض المشاكل في الأقسام الأخرى. سنقوم باكتشاف كيفية حل المشكلة للمرة القادمة. لقد اعتدت على المعاناة من هذه المشكلة أيضًا، ولكني اكتشفت بعد ذلك أداة ساعدتني في حلها. شخصيًا، إني أقوم باستخدام أداة تدعى وقت الإنقاذ RescueTime، لقد أنقذت لي حياتي. أود أن أوصيك بتجربة ذلك لترى كيف بإمكانك تنظيم وقتك بشكل أمثل. 9. إذا تم رفض أداء الموظف هناك العديد من الأسباب التي قد تؤدي لرفض أداء الموظف، فمن المهم عدم التوصل إلى استنتاجات ومعالجة الموضوع بعناية تامة. قبل توبيخ الموظف أو تقديم تغذية راجعة سلبية، عليك أولًا أن تقابل الموظف وتحاول معرفة السبب وراء ذلك التراجع. قم بتقديم الدعم فهو أمر مهم للغاية. إليك ما يمكنك قوله: لقد لاحظت بعض التغييرات في عادات ونتائج عملك خلال الأسبوع الماضي. إني أعلم تمامًا كيف هي إنتاجيتك الاعتيادية في العمل، لذا فإني أردت أن أتحقق وإياك من احتمال وجود مشكلة ما فقد أكون قادرًا على مساعدتك. أو إن كان هناك ما تريد التحدث بشأنه، فأنا هنا دائمًا لأستمع إليك. إنني أعلم بأننا نستطيع حل هذه المشكلة معًا، وأنا واثق من أنك تستطيع العودة لأدائك المميز مرة أخرى. 10. إذا كان الموظف يقوم بنشر الإشاعات لسوء الحظ، تنتشر الإشاعات كثيرًا في ساحة المدرسة. كما تنتقل إلى جميع أماكن العمل تقريبًا. من المهم أن يتحكم المدراء بالأمر في حال حدوثه لأن الأحاديث والشائعات الكاذبة يمكن أن تقتل روح الجماعة وتساعد على ظهور المشاكل. إن كنت تعلم من هو الموظف الذي يقوم بنشر الإشاعات، فمن المهم أن تقوم بالتحدث معهم بشكل خاص. إليك ما يمكنك قوله: لقد فوجئت قليلًا عند اكتشافي بأنك كنت تتحدث بشأن هذا الأمر مع الموظفين الآخرين. إني أتفهّم السبب ومتأسف لشعورك بتلك المشاعر تجاه هذا الموضوع، ولكني أريد منك أن تعرف بأنه يمكنك دائمًا أن تأتي وتتحدث معي بشأن هذه المخاوف. وستكون تلك هي الطريقة الأكثر فعالية لمعالجة المشكلة. المشكلة هي أنك عندما تتحدث بشأن ذلك مع الموظفين الآخرين فإن ذلك من شأنه أن يخلق نوع من الطاقة السلبية في مكان العمل وقد يؤدي إلى إضعاف روح العمل. أريد أن يكون جميع الموظفين سعداء ويشعرون بالأمان، وأعلم أنك تريد الأمر ذاته- لذلك دعنا نقوم بحل هذه المشكلة معًا. بعد ذلك إن كنت تعتبر أن الأمر لا يزال يتعلق بالفريق، يجب علينا حينها أن نتحدث جميعًا ومع بعضنا، ولكن من الأفضل أن نخرج لمكان آمن. نصائح لمزيد من التغذية الراجعة الفعّالة من المدهش مدى مشاركة علم النفس والليونة في الحديث في تقديم التغذية الراجعة. في حين أن بعض تلك البنود قد تبدو مبالغًا بها، إلا أنها حقًا ليست كذلك. إن الناس أكثر حساسية مما قد تعتقد، لذلك فمن المهم أن تكون لطيفًا عند تقديم تعليقاتك وتغذيتك الراجعة. 1. التركيز على السلوك، وليس على الشخص ربما كانت تلك هي أهم نصيحة. يجب ألا تكون التغذية الراجعة بمثابة هجوم شخصي، بل يجب أن تكون مفيدة وتهدف إلى تحسين سلوك معين. إحدى الأفكار المفيدة هنا هي أن تشرح كيفية شعورك حيال ذلك السلوك. فمن خلال القيام بذلك، تكون قد أجبرت نفسك على التركيز على السلوك. على سبيل المثال: لقد لاحظت أنك لم تكن موجودًا في آخر اجتماعين للفريق. إني قلق لأنك قد تفوّت بعض المعلومات الهامة. هل يمكن أن نلتقي لمناقشة ما فاتك؟ هذا أفضل من أن تقول “من الواضح أنك لا تهتم بهذا الفريق لأنك لا تأتي لحضور الاجتماعات”. 2. تذكر بأن التغذية الراجعة هي ببساطة رأيك في بعض الأحيان، يقول القادة عبارات مثل “يشعرون” أو “نعتقد” أو عبارات أخرى على نمطها حيث يبدو وكأن الجميع يتفق مع ملاحظاتك. ويتم ذلك بهدف جعل الرسالة أكثر قوة وتجنيب نفسك تلقّي اللوم. في حين أن هذا قد يبدو وكأنه فكرة ذكية من الناحية النظرية، إلا أنه يجب عليك استخدام كلمة “أنا” بدلًا من تلك العبارات. الأمر الذي سيسمح للموظف بأن يتعاطف معك (وخاصة إن تحدثت بشعورك تجاه سلوك معين). مرة أخرى، تذكر بأن التغذية الراجعة هي ببساطة عبارة عن رأيك. 3. لا تستخدم أسلوب شطيرة التغذية الراجعة يعتقد الكثير من الأشخاص بأن شطيرة التغذية الراجعة ستعمل على التخفيف من وطأة التعليقات كما تعتبر فكرة عظيمة. لا تقم بذلك. في الحقيقة ليست فكرة جيدة. إحدى الأوراق البحثية تدعى أخبرني بالخطأ الذي اقترفته حيث تبحث في كيفية استجابة مختلف الأشخاص للتغذية الراجعة، وقد أظهرت تلك الورقة بأن شطيرة التغذية الراجعة غير مجدية في معظم الوقت. من الورقة البحثية: غالبًا ما تكون التغذية الراجعة السلبية مدفونة وغير محددة أبدًا. يقولون بأن الفكرة الأذكى هي أن تكون واضحًا، وسيقدّر الموظفون صدقك. تكمن المشكلة في أن بعض الأشخاص يستمعون فقط إلى الجزء الإيجابي من التغذية الراجعة ويتوقفون عن الاستماع عندما تصل إلى الجزء السلبي. 4. لا تنسى الإيجابية لقد أظهرت الدراسات أنه عندما تكون التغذية الراجعة سلبية في معظمها فإنها تقوم بتثبيط الجهد والعزيمة في المستقبل. تذكر بأن تسلط الضوء على الجهد الجيد وأن تحرص على تحفيز الموظفين. لا تستخدم تلك الإيجابية كجزء من أسلوب الشطيرة، ولكن ضع في اعتبارك بأنه يجب أن يتم ملاحظة الجهود الإيجابية. 5. المتابعة قد يبدو هذا واضحًا، ولكن تذكر أن تقوم بمتابعة كل الأشخاص الذين تقدم لهم التغذية الراجعة. إن التغذية الراجعة غير مجدية دائمًا إن لم يتطور الموظف ويحسن أدائه، لذلك عليك أن تتأكد من متابعتك له بعد فترة زمنية معينة لتلاحظ كيفية سير الأمور. قد بتقديم الدعم للموظفين أثناء تنفيذ العملية بأكملها. ترجمة –بتصرّف- لمقال 10 Examples Of Giving Effective Employee Feedback لكاتبته Ali Robins حقوق الصورة البارزة محفوظة لـ Freepik1 نقطة
-
في بدايات التسعينات، قام Guido van Rossum بإنشاء لغة البايثون. تُعتبر البايثون من أشهر لغات البرمجة حاليا، ولها حضور واسع في العديد من المجالات التطبيقية والعلمية، وتتميز بسهولة شفرتها البرمجية وسرعة تعلمها مع متانة وقوة تضاهي اللغات الأخرى. سوف نتناول في هذا المقال المواضيع التالية: التعليقات. أنواع البيانات. المتغيرات والتراكيب. جمل التحكم. الدوال Functions. الوحدات. الفئات. ملاحظة: إصدار البايثون 3 هو المعتمد في شرح هذا المقال، وناتج العمليات والأوامر في هذا المقال سيتم كتابتها بعد الرمز # =>. التعليقات تبدأ التعليقات ذات السطر الواحد برمز #، أما التعليقات التي تحتوي أكثر من سطر فتجب إحاطتها بثلاث علامات تنصيص (منفردة أو مزدوجة) في البداية والنهاية. أنظر المثال التالي: # Single line comments start with a number symbol. """ Multiline strings can be written using three "s, and are often used as documentation. """ دورة تطوير التطبيقات باستخدام لغة Python احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة اشترك الآن أنواع البيانات والعمليات الأرقام: 3 # => 3 العمليات الرياضية: 1 + 1 # => 2 8 - 1 # => 7 10 * 2 # => 20 35 / 5 # => 7.0 يوجد نوعان من القسمة في بايثون 3، الأولى تُسمى القسمة بعدد فاصل عائم “floating point division” ونَستخدم رمز القسمة المعروف / ، وناتج العملية هو دائما عدد حقيقي من النوع float: 10.0 / 3 # => 3.3333333333333335 أما النوع الثاني من القسمة فيُسمى القسمة الصحيحة “integer division” ونَستخدم الرمز // لهذا النوع، ويكون ناتج العملية دون الفاصلة والأرقام التي بعدها: 5 // 3 # => 1 5.0 // 3.0 # => 1.0 # يعمل هذا النوع من القسمة على الأعداد الحقيقية أيضا -5 // 3 # => -2 -5.0 // 3.0 # => -2.0 عملية باقي القسمة: 7 % 3 # => 1 عملية الأس: 2**3 # => 8 قاعدة أولوية العمليات حسب الأقواس: (1 + 3) * 2 # => 8 القيم المنطقية (لاحظ الحرف الكبير في البداية): True False عكس القيمة المنطقية باستخدام not: not True # => False not False # => True العمليات المنطقية (العمليات المنطقية حساسة لحالة الأحرف): True and False # => False False or True # => True القيمة المنطقية False تساوي الرقم 0، والقيمة المنطقية True تساوي الرقم 1: 0 and 2 # => 0 -5 or 0 # => -5 0 == False # => True 2 == True # => False 1 == True # => True -5 != False != True #=> True عملية فحص المساواة باستخدام ==: 1 == 1 # => True 2 == 1 # => False فحص عدم المساواة: 1 != 1 # => False 2 != 1 # => True المقارنات: 1 < 10 # => True 1 > 10 # => False 2 <= 2 # => True 2 >= 2 # => True 1 < 2 < 3 # => True 2 < 3 < 2 # => False تفحص عملية is إذا كان متغيران يشيران لنفس الكائن أم لا، ولكن العملية == تفحص إذا كانا بنفس القيمة أم لا: a = [1, 2, 3, 4] b = a b is a # => True b == a # => True b = [1, 2, 3, 4] b is a # => False b == a # => True تُنشَأ النصوص باستخدام علامات التنصيص المزدوجة أو الفردية: "This is a string." 'This is also a string.' تستطيع جمع النصوص ببعضها، ولكن حاول تجنب هذه الطريقة: "Hello " + "world!" # => "Hello world!" تستطيع دمج النصوص ببعضها دون استخدام + : "Hello " "world!" # => "Hello world!" من الممكن التعامل مع النص وكأنه مصفوفة من الحروف: "This is a string"[0] # => 'T' للحصول على طول نص نستخدم الدالة المضمنة len : len("This is a string") # => 16 تستطيع استخدام الدالة format لإجراء عملية التنسيق على النص: "{} can be {}".format("Strings", "interpolated") # => "Strings can be interpolated" تستطيع عند استخدام الدالة format ترقيم المدخلات حسب ترتيبها واستخدامها في تنسيق النص أكثر من مرة: "{0} be nimble, {0} be quick, {0} jump over the {1}".format("Jack", "candle stick") # => "Jack be nimble, Jack be quick, Jack jump over the candle stick" أو باستخدام طريقة تسمية المدخلات: "{name} wants to eat {food}".format(name="Bob", food="lasagna") # => "Bob wants to eat lasagna" تستطيع في البايثون 3 استخدام الطريقة القديمة في بايثون 2 لعمل تنسيق للنصوص: "%s can be %s the %s way" % ("Strings", "interpolated", "old") # => "Strings can be interpolated the old way" None عبارة عن كائن: None # => None لا تستخدم فحص المساواة باستخدام رمز == للمقارنة مع None واستخدم عملية الفحص is بدلا منها: "etc" is None # => False None is None # => True None والرقم 0 والمتغيرات الفارغة من الأنواع strings، lists، dict، وtuples جميعها تُرادف القيمة المنطقية False، أما باقي القيم فهي True: # All other values are True bool(0) # => False bool("") # => False bool([]) # => False bool({}) # => False bool(()) # => False المتغيرات والتراكيب: تتوفّردالة خاصة للطباعة (الإخراج على الطرفية) وتسمى print: print("I'm Python. Nice to meet you!") # => I'm Python. Nice to meet you! يُطبَع سطر جديد تلقائيا عند استخدام الدالة print. تستطيع استخدام المعطى end لتغيير هذا الأمر وتحديد النص الذي تريده بدلا من السطر الجديد: print("Hello, World", end="!") # => Hello, World! للحصول على مدخلات من الطرفية نستخدم الدالة input: input_string_var = input("Enter some data: ") # Returns the data as a string ملاحظة/ في النسخ القديمة من البايثون، كانت الدالة input باسم raw_input. لا يوجد في البايثون تعريفات، ولكن يوجد إعطاء قيم مباشرة. الطريقة المتعارف عليها في تسمية المتغيرات هي الأحرف الصغيرة مع التسطير السفلي: some_var = 5 some_var # => 5 محاولة استخدام متغير لم يأخذ قيمة مسبقاً ينتج عنه خطأ، راجع كيفية معالجة الأخطاء تحت عنوان جمل التحكم. some_unknown_var # ينتُج خطأ من الصنف NameError تشبه القوائم المصفوفات في اللغات الأخرى: li = [] other_li = [4, 5, 6] نستخدم append لإضافة عناصر في نهاية القائمة: li.append(1) # li is now [1] li.append(2) # li is now [1, 2] li.append(4) # li is now [1, 2, 4] li.append(3) # li is now [1, 2, 4, 3] نستخدم الدالةpop لحذف العناصر من آخر القائمة. ترجع التعليمة أدناه القيمة 3 وتصبح مكونات القائمة [1, 2, 4]: li.pop() # => 3 and li is now [1, 2, 4] تعود القائمة إلى حالتها السابقة لتنفيذ الدالة pop بعد تنفيذ الدالة append على النحو التالي: li.append(3) # li is now [1, 2, 4, 3] again. تستطيع التعامل مع القائمة مثل المصفوفة من حيث الوصول لعناصرها: li[0] # => 1 li[-1] # => 3 في حال استخدام فهرس خارج حدود القائمة سينتج خطأ من نوع IndexError: li[4] # Raises an IndexError تستطيع استخدام مجال للحصول على جزء أكبر من القائمة بحيث نحدد فهرس البداية وفهرس النهاية. li[1:3] # => [2, 4] ملاحظة: فهرس النهاية غير مشمول في القيمة المرجعة، حيث يعدّ النمط المستخدم هو نمط نطاق مغلق-مفتوح. في حال عدم استخدام فهرس النهاية: li[2:] # => [4, 3] في حال عدم استخدام فهرس البداية: li[:3] # => [1, 2, 4] اختيار عنصر كل خطوتين ابتداء من العنصر الأول في القائمة: li[::2] # =>[1, 4] إرجاع كامل المصفوفة بطريقة عكسية: li[::-1] # => [3, 4, 2, 1] القاعدة العامة للاستعلامات السابقة في القوائم هي كالتالي(البداية start، النهاية end والخطوة step): # li[start:end:step] نسخ عميق (Deep Copy): li2 = li[:] # => li2 = [1, 2, 4, 3] عندما نفحص المساواة باستخدام عملية is كالتالي: (li2 is li) ستكون النتيجة False. لحذف عنصر من القائمة: del li[2] # li is now [1, 2, 3] لحذف أول عنصر في القائمة يساوي القيمة المدخلة في الدالة remove: li.remove(2) # li is now [1, 3] li.remove(2) # ValueError لأن القيمة غير موجودة إضافة عنصر في مكان معين في القائمة: li.insert(1, 2) # li is now [1, 2, 3] again الحصول على فهرس أول عنصر في القائمة يساوي القيمة المعطاة: li.index(2) # => 1 li.index(4) # ValueError لأن القيمة غير موجودة لإضافة قائمة لقائمة وإرجاع النتيجة كقائمة جديدة: li + other_li # => [1, 2, 3, 4, 5, 6] لتمديد قائمة وإضافة قائمة إليها: li.extend(other_li) # Now li is [1, 2, 3, 4, 5, 6] لفحص وجود قيمة في القائمة: 1 in li # => True للحصول على حجم القائمة (عدد العناصر التي بها): len(li) # => 6 نوع البيانات Tuple تشبه القائمة ولكنها غير قابلة للتعديل (ثابتة-immutable): tup = (1, 2, 3) tup[0] # => 1 tup[0] = 3 # Raises a TypeError لاحظ أنه في حالة وجود عنصر واحد في tuple لابد من وضع فاصلة عادية بعد العنصر، أما في حالة وجود أكثر من عنصر فتصبح الفاصلة إضافية: type((1)) # => <class 'int'> type((1,)) # => <class 'tuple'> type(()) # => <class 'tuple'> تستطيع تنفيذ أغلب عمليات القوائم على النوع Tuple: len(tup) # => 3 tup + (4, 5, 6) # => (1, 2, 3, 4, 5, 6) tup[:2] # => (1, 2) 2 in tup # => True تستطيع تفريغ (unpacking) محتويات Tuples وكذلك القوائم في متغيرات كما في الأمثلة التالية: a, b, c = (1, 2, 3) # a = 1, b = 2, c = 3 a, *b, c = (1, 2, 3, 4) # a = 1, b = [2, 3], c = 4 عند عدم استخدام الأقواس فإن نوع البيانات التلقائي الذي سيتم استخدامه هو Tuple: d, e, f = 4, 5, 6 تبديل قيم المتغيرات بطريقة سهلة: e, d = d, e # d = 5, e = 4 القواميس عبارة عن مؤشرات (مُخططات) من المفاتيح للقيم (كل مفتاح يؤشر على قيمة خاصة به). تعريف قاموس فارغ: empty_dict = {} تعريف قاموس بقيم مسبقة: filled_dict = {"one": 1, "two": 2, "three": 3} لاحظ أن المفاتيح في القواميس لابد أن يكون نوع بياناتها ثابتا (immutable) وذلك لضمان الحصول على مفتاح ثابت (لا تتغير قيمته). أنواع البيانات الثابتة والتي من الممكن استخدامها هي int , float, string, tuple. invalid_dict = {[1,2,3]: "123"} # => Raises a TypeError: unhashable type: 'list' valid_dict = {(1,2,3):[1,2,3]} # Values can be of any type, however. يمكن للقيم – عكس المفاتيح – أن تكون من أي نوع. للبحث عن قيم نستخدم الأقواس المعكوفة: filled_dict["one"] # => 1 للحصول على مفاتيح قاموس على شكل قائمة (الترتيب في القواميس غير ثابت): list(filled_dict.keys()) # => ["three", "two", "one"] للحصول على قيم قاموس على شكل قائمة: list(filled_dict.values()) # => [3, 2, 1] للتأكد من وجود مفتاح قاموس معين: "one" in filled_dict # => True 1 in filled_dict # => False في حالة استخدام مفتاح غير موجود للبحث في قاموس، فإن ذلك ينتج خطأ: filled_dict["four"] # KeyError استخدم الدالة get لتجنب الخطأ السابق: filled_dict.get("one") # => 1 filled_dict.get("four") # => None تدعم الدالة get إعادة قيمة تلقائية في حالة عدم وجود المفتاح: filled_dict.get("one", 4) # => 1 filled_dict.get("four", 4) # => 4 تضيف الدالة setdefault المفتاح المُمرر إلى القاموس في حالة عدم وجوده. تضيف التعليمة التالية مفتاحا باسم five وتعطيه قيمة 5، أما التعليمة الثانية فلا تحدت تغييرا على القاموس. filled_dict.setdefault("five", 5) # filled_dict["five"] is set to 5 filled_dict.setdefault("five", 6) # filled_dict["five"] is still 5 للإضافة إلى القاموس: filled_dict.update({"four":4}) # => {"one": 1, "two": 2, "three": 3, "four": 4} filled_dict["four"] = 4 # طريقة أخرى حذف المفتاح من القاموس: del filled_dict["one"] # Removes the key "one" from filled dict بعض طرق التفريغ في القواميس: {'a': 1, **{'b': 2}} # => {'a': 1, 'b': 2} {'a': 1, **{'a': 2}} # => {'a': 2} المجموعات: empty_set = set() some_set = {1, 1, 2, 2, 3, 4} # some_set is now {1, 2, 3, 4} نوع البيانات الخاص بعناصر المجموعات لابد أن يكون ثابتا: invalid_set = {[1], 1} # => Raises a TypeError: unhashable type: 'list' valid_set = {(1,), 1} للإضافة إلى المجموعة: filled_set.add(5) # filled_set is now {1, 2, 3, 4, 5} إجراء عملية التقاطع بين مجموعتين: other_set = {3, 4, 5, 6} filled_set & other_set # => {3, 4, 5} إجراء عملية الاتحاد بين مجموعتين: filled_set | other_set # => {1, 2, 3, 4, 5, 6} إجراء عملية الطرح بين مجموعتين: {1, 2, 3, 4} - {2, 3, 5} # => {1, 4} لإجراء عملية فرق التماثل بين مجموعتين: {1, 2, 3, 4} ^ {2, 3, 5} # => {1, 4, 5} لفحص إذا كانت المجموعة على الشمال هي مجموعة تحتوي المجموعة على اليمين أم لا: {1, 2} >= {1, 2, 3} # => False عكس المثال السابق: {1, 2} <= {1, 2, 3} # => True فحص وجود قيمة في مجموعة: 2 in filled_set # => True 10 in filled_set # => False جمل التحكم some_var = 5 جملة if: if some_var > 10: print("قيمة المتغيّر أكبر تماما من 10") elif some_var < 10: # هذه الجملة اختيارية print("قيمة المتغيّر أصغر من 10") else: # هذه الجملة اختيارية print("قيمة المتغيّر تساوي 10") جملة for: for animal in ["dog", "cat", "mouse"]: print("{} is a mammal".format(animal)) لاحظ استخدام الدالة format في جملة for السابقة. يمكن أيضا تطبيق الجملة على مجال عددي range: for i in range(4): print(i) for i in range(4, 8): print(i) for i in range(4, 8, 2): print(i) جملة while: x = 0 while x < 4: print(x) x += 1 # اختصارا ل x = x + 1 معالجة الأخطاء باستخدام try/except (استخدم raise لتوليد الخطأ): try: raise IndexError("This is an index error") except IndexError as e: pass except (TypeError, NameError): pass else: print("All good!") finally: print("We can clean up resources here") ملاحظات حول معالجة الأخطاء: Pass تعني عدم وجود عملية للتنفيذ. تستطيع سرد أكثر من نوع خطأ في جملة except. تستطيع استخدام جملة else مع try/except اختياريا (تنفذ في حالة كانت الشفرة البرمجية في try لم تُصدر أي خطأ). نستخدم جملة finally لتنفيذ شفرة برمجية بعد try/except بغض النظر عن وجود أخطاء أم لا، وعادةً يُعاد تحرير المصادر المستخدمة. بدلا من استخدام جملة finally لإعادة تحرير المصادر المستخدمة، تستطيع استخدام جملة with: with open("myfile.txt") as f: for line in f: print(line) تُقدم البايثون كائنًا متُعددًا (Iterable) وهو كائن مجرد (عام) يُتعامل معه مثل sequence. فمثلا الكائن المُرجع من الدالة range هو كائن مُتعدد: filled_dict = {"one": 1, "two": 2, "three": 3} our_iterable = filled_dict.keys() print(our_iterable) # => dict_keys(['one', 'two', 'three']). تستطيع المرور على عناصر الكائن المتعدد والتعامل معها: for i in our_iterable: print(i) # Prints one, two, three على الرغم من خاصية الكائن المتعدد، إلا أنه لا تستطيع استخدام الفهرس معه: our_iterable[1] # Raises a TypeError تستطيع الحصول من خلال الكائن المُتعدد على كائن iterator منه بحيث تستطيع المرور على عناصره: our_iterator = iter(our_iterable) يحتفظ الكائن iterator بحالته كلما تم استخدامه، فمثلا، باستخدام وظيفة next تستطيع الحصول على العنصر التالي في هذا الكائن: next(our_iterator) # => "one" next(our_iterator) # => "two" next(our_iterator) # => "three" بعد الحصول على كافة عناصر iterator فإن استخدام الدالة next سيعيد خطأ: next(our_iterator) # Raises StopIteration تستطيع الحصول على كافة عناصر iterator دفعة واحدة على شكل قائمة وذلك باستخدام الدالة list : list(filled_dict.keys()) # => Returns ["one", "two", "three"] الدوال نستخدم الكلمة def في تعريف الدالة، ونستخدم كلمة return في إرجاع النتيجة: def add(x, y): print("x is {} and y is {}".format(x, y)) return x + y تطبع الدالة السابقة قيمتيْ المعامليْن المُمرّرين لها وتعيد ناتج جمعهما: add(5, 6) # => prints out "x is 5 and y is 6" and returns 11 يمكن أيضا استدعاء الدالة بذكر أسماء المعاملات (شرط الترتيب غير مطلوب هنا للمعاملات): add(y=6, x=5) تستطيع تعريف دالة باستقبال عددًا غير محدد من المعاملات: def varargs(*args): return args varargs(1, 2, 3) # => (1, 2, 3) من الممكن استخدام المعاملات المُسماة لاستقبال عدد غير محدد من المعاملات أيضا: def keyword_args(**kwargs): return kwargs keyword_args(big="foot", loch="ness") # => {"big": "foot", "loch": "ness"} كما نستطيع دمج الطريقتين في نفس الدالة: def all_the_args(*args, **kwargs): print(args) print(kwargs) all_the_args(1, 2, a=3, b=4) # => (1, 2) {"a": 3, "b": 4} توجد طريقة أخرى لاستدعاء الدوال باستخدام args/kwargs وذلك عندما تكون المعطيات من النوع tuple أو قاموس: args = (1, 2, 3, 4) kwargs = {"a": 3, "b": 4} all_the_args(*args) # equivalent to foo(1, 2, 3, 4) all_the_args(**kwargs) # equivalent to foo(a=3, b=4) all_the_args(*args, **kwargs) # equivalent to foo(1, 2, 3, 4, a=3, b=4) يمكن أيضا إرجاع نتيجة من قيم متعددة على شكل tuple: def swap(x, y): return y, x x = 1 y = 2 x, y = swap(x, y) # => x = 2, y = 1 يختلف المتغيّر في نطاق scope الدالة عن المتغيّرات العامة Global: x = 5 def set_x(num): x = num # => 43 print(x) # => 43 تُستخدَم الكلمة المفتاحية global لتعريف متغيّر عام من داخل الدالة: def set_global_x(num): global x print(x) # => 5 x = num # هذا المتغير يمثل المتغير على النطاق العام وقيمته الان 6 print(x) # => 6 set_x(43) set_global_x(6) تعدّ الدوال في بايثون كائنات من الفئة الأولى: def create_adder(x): def adder(y): return x + y return adder add_10 = create_adder(10) add_10(3) # => 13 كما يمكنك تعريف دوال غير مسمّاة Anonymous functions: (lambda x: x > 2)(3) # => True (lambda x, y: x ** 2 + y ** 2)(2, 1) # => 5 ويمكنك تمرير الدالة معاملا لدالة أخرى: list(map(add_10, [1, 2, 3])) # => [11, 12, 13] list(map(max, [1, 2, 3], [4, 2, 1])) # => [4, 2, 3] list(filter(lambda x: x > 5, [3, 4, 5, 6, 7])) # => [6, 7] تستطيع استخدام مبدأ “تفهيم القائمة” للحصول على نفس نتيجة الدوال map و filter: [add_10(i) for i in [1, 2, 3]] # => [11, 12, 13] [x for x in [3, 4, 5, 6, 7] if x > 5] # => [6, 7] تستطيع استخدام مبدأ “تفيهم القاموس” و “تفهيم المجموعة” كذلك: {x for x in 'abcddeef' if x not in 'abc'} # => {'d', 'e', 'f'} {x: x**2 for x in range(5)} # => {0: 0, 1: 1, 2: 4, 3: 9, 4: 16} الوحدات Modules الوحدات في بايثون عبارة عن ملفات بايثون عادية. تستطيع أن تكتب الوحدة الخاصة بك وتستوردها في الشفرة البرمجة الخاصة بمشروعك. اسم الوحدة سيكون نفس اسم الملف الذي أنشأته لهذا الغرض. تُستورَد الوحدات بالطريقة التالية: import math print(math.sqrt(16)) # => 4.0 تستطيع الحصول على دوال محددة من الوحدات: from math import ceil, floor print(ceil(3.7)) # => 4.0 print(floor(3.7)) # => 3.0 تستطيع استيراد جميع الدوالّ من الوحدة دفعة واحدة ولكن هذا الأمر غير منصوح به: from math import * تستطيع اختصار أسماء الوحدات عند استيرادها: import math as m math.sqrt(16) == m.sqrt(16) # => True تُستخدَم الدالة المضمنة dir لمعرفة مكان ملف الوحدة. import math dir(math) إذا كان لديك ملف بايثون باسم math في نفس المجلد الذي يوجد به ملف العمل الخاص بك، فإن الملف math هو الذي سيُحمَّل ويُستورد بدلا من الوحدة التلقائية المضمنة في البايثون باسم math ذلك لأن الأولوية في حال تشابه الأسماء هي للملفات في مجلد العمل المحلي أو الحالي. دورة تطوير التطبيقات باستخدام لغة Python احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة اشترك الآن الأصناف Classes نستخدم كلمة class لتعريف صنف: class Human: لتعريف خاصية للصنف (هذه الخاصية تكون مُشاركة بين كل العناصر المتولدة من هذا الصنف): species = "H. sapiens" init هو المشيّدات Constructor الأساسي ويُستدعى عند توليد عنصر من الصنف. التسطير السفلي المكرر مرتين قبل كلمة init وبعدها يدل على أن هذا الكائن أو الخاصية يستخدمه بايثون ولا يجب علينا استخدامها مباشرة. def __init__(self, name): # إعطاء قيمة المعطى للخاصية الموجودة في الصنف self.name = name # قيمة مبدئية self._age = 0 الدالة say هي تابع عيّنة Instance method، أي أن لكل كائن نسخة خاصة به منها. تأخذ هذه التوابع أن self في أول معامل يُمرّر لها: def say(self, msg): print ("{name}: {message}".format(name=self.name, message=msg)) def sing(self): return 'yo... yo... microphone check... one two... one two...' يمكن أيضا تعريف تابع متشارك بين كل كائنات الصنف: @classmethod def get_species(cls): return cls.species نستطيع كذلك تعريف تابع ساكن يُستدعى دون الحاجة لإنشاء كائن من الصنف: @staticmethod def grunt(): return "*grunt*" يحوّل التعليمة property@ دالة إلى خاصيّة للقراءة فقط لها نفس اسم الدالة، لتؤدّي بالتالي وظيفة المسترجعات Getters. @property def age(self): return self._age يمكننا جعل الخاصية قابلة للتعيين لتصبح الدالة تعمل معدّلا Setter: @age.setter def age(self, age): self._age = age كما يمكننا السماح بحذفها: @age.deleter def age(self): del self._age يقوم مُفسر البايثون بتنفيذ كافة اشيفرة البرمجية في ملف الوحدة الذي يقرأه، ومن خلال الخاصية name نتأكد من أن كتلة الشفرة البرمجية التي في جملة الشرط ستُنفَّذ في حال كانت الوحدة هي البرنامج الرئيسي المُنفذ: if __name__ == '__main__': i = Human(name="Ian") i.say("hi") # "Ian: hi" j = Human("Joel") j.say("hello") # "Joel: hello" # استدعاء دالة الفئة i.say(i.get_species()) # "Ian: H. sapiens" # تغيير الخاصية المشتركة Human.species = "H. neanderthalensis" i.say(i.get_species()) # => "Ian: H. neanderthalensis" j.say(j.get_species()) # => "Joel: H. neanderthalensis" # استدعاء الدالة الساكنة print(Human.grunt()) # => "*grunt*" لا تستطيع استدعاء الدالة الساكنة من خلال العنصر المتولد i لأن استدعاءها بهذه الطريقة سيضيف self كمعامل لها مما سينتج عنه خطأ: print(i.grunt()) # => TypeError: grunt() takes 0 positional arguments but 1 was given i.age = 42 i.say(i.age) # => "Ian: 42" j.say(j.age) # => "Joel: 0" del i.age # i.age # => this would raise an AttributeError ترجمة -وبتصرف- للمقال Learn X in Y minutes Where X=Python3 اقرأ أيضا: تعلم لغة بايثون1 نقطة