التغليف في بيثون 3

صورة


تعريف


معنى مصطلح "التغليف" غامض ويختلف من مصدر إلى آخر. من المقبول عمومًا أن التغليف هو أحد المبادئ الأساسية لـ OOP ، على الرغم من أن بعض المقالات العلمية تحذف تمامًا التغليف من القائمة. على سبيل المثال ، يذكر جون ميتشل في كتاب "مفاهيم في لغات البرمجة" ، عند سرد المفاهيم الرئيسية في OOP ، التجريد فقط - وهو مصطلح يعتبر قريبًا من التغليف بالمعنى ، ولكنه لا يزال أكثر شمولًا وأعلى مستوى. روبرت مارتن ، من ناحية أخرى ، في كتابه "العمارة الصرفة" ، ينص صراحة على أن التغليف ، والميراث ، وتعدد الأشكال تعتبر أساس OOP.


مجموعة متنوعة من التعريفات المقدمة لمصطلح "التغليف" يصعب الوصول إلى قاسم مشترك. بشكل عام ، يمكن التمييز بين نهجين لمعنى هذا المصطلح. يمكن اعتبار التغليف على النحو التالي:


  • توصيل البيانات بالطرق التي تتحكم في هذه البيانات ؛
  • مجموعة من الأدوات للتحكم في الوصول إلى البيانات أو الأساليب التي تدير هذه البيانات.

التغليف كاتصال


هذا النوع من التفسير لمصطلح "التغليف" سهل للغاية في التفسير. في هذه الحالة ، فإن أي فئة فيها متغير واحد على الأقل وطريقة واحدة تتحكم فيه توضح بوضوح هذا المبدأ.


#!/usr/bin/python3 class Phone: number = "111-11-11" def print_number(self): print( "Phone number is: ", self.number ) my_phone = Phone() my_phone.print_number() input( "Press Enter to exit" ) 

تجمع فئة الهاتف بين البيانات في الرقم المتغير وطريقة print_number ()


يمكنك إنشاء فئة تتكون فقط من الأساليب (ولا تحتوي على متغيرات) ، والتي قد تكون ملائمة في بعض لغات البرمجة. من الممكن أيضًا إنشاء فصل يحتوي على بيانات فقط ، دون طرق ، والتي يجب تجنبها في كثير من الحالات. يجب تطبيق كلتا العمليتين عند الضرورة ، وتكون علاقته بتغليف "التوحيد" قابلة للنقاش.


التغليف كما التحكم في الوصول


يتطلب شرح مفهوم تقييد الوصول إلى البيانات أو الطرق مزيدًا من التفاصيل. بادئ ذي بدء ، في هذا السياق ، ينبغي فهم مصطلح "الوصول" على أنه القدرة على رؤية و / أو تعديل المحتويات الداخلية للفصل الدراسي. هناك العديد من مستويات الوصول التي توفرها معظم لغات OOP. بإيجاز ، يمكننا القول أن بيانات الكائن يمكن أن تكون:


  • عام (عام) - البيانات متاحة للجميع ؛
  • خاص ( private ) - تتوفر البيانات فقط للكائن / الفئة التي ينتمي إليها.

معظم اللغات لديها درجات إضافية من الوصول بين هذه الحدود. على سبيل المثال ، في C ++ و Python3 ، هناك ثلاثة مستويات للوصول: عامة ومحمية وخاصة ؛ تضيف C # الكلمة الأساسية "داخلي" إلى القائمة.


تجدر الإشارة إلى أنه في معظم لغات البرمجة ، يتم تعيين مستوى الوصول إلى أي بيانات بشكل افتراضي. على سبيل المثال ، في C ++ ، بشكل افتراضي ، يتم تعيين مستوى الوصول إلى البيانات في الفصل الدراسي إلى القطاع الخاص - فقط أعضاء وأصدقاء الفصل يمكنهم الوصول إلى بياناته. يختلف المستوى القياسي للوصول إلى البنية ( struct ) في C ++ - فهو عام ، ويمكن لأي شخص الوصول إلى البيانات في مثل هذه البنية. يعتمد مستوى الوصول لمتغيرات الفصل وأساليبه في Python 3 تمامًا على بناء الجملة.


أمثلة


التغليف


يوفر Python 3 ثلاثة مستويات من الوصول إلى البيانات:


  • عام (عام ، لا يوجد بناء جملة خاص ، publicBanana ) ؛
  • محمي ( protected ، تسطير أسفل السطر في بداية الاسم ، _protectedBanana ) ؛
  • خاص ( private ، شرطين __privateBanana في بداية الاسم ، __privateBanana ).

للإيجاز والبساطة ، يتم إبراز مستويين فقط (خاص وعام) في المثال.


 #!/usr/bin/python3 class Phone: username = "Kate" # public variable __how_many_times_turned_on = 0 # private variable def call(self): # public method print( "Ring-ring!" ) def __turn_on(self): # private method self.__how_many_times_turned_on += 1 print( "Times was turned on: ", self.__how_many_times_turned_on ) my_phone = Phone() my_phone.call() print( "The username is ", my_phone.username ) # my_phone.turn_on() # my_phone.__turn_on() # print( “Turned on: “, my_phone.__how_many_times_turned_on) # print( “Turned on: “, my_phone.how_many_times_turned_on) # will produce an error input( "Press Enter to exit" ) 

يمكن الحصول على المتغيرات العامة والأساليب من البرنامج الرئيسي. ستؤدي محاولة استرداد البيانات الخاصة أو تشغيل طريقة خاصة إلى حدوث خطأ.


تغليف التغليف


توفر اللغة نفسها للمبرمج أداة بناء جملة يمكنها الالتفاف على التغليف. لا تزال قراءة وتعديل المتغيرات الخاصة واستدعاء الوظائف الخاصة ممكنة.


 #!/usr/bin/python3 class Phone: username = "Kate" # public variable __serial_number = "11.22.33" # private variable __how_many_times_turned_on = 0 # private variable def call(self): # public method print( "Ring-ring!" ) def __turn_on(self): # private method self.__how_many_times_turned_on += 1 print( "Times was turned on: ", self.__how_many_times_turned_on ) my_phone = Phone() my_phone._Phone__turn_on() my_phone._Phone__serial_number = "44.55.66" print( "New serial number is ", my_phone._Phone__serial_number ) input( "Press Enter to exit" ) 

بضع كلمات عن السحر


هناك طرق تسمى "الأساليب السحرية" أو "الطرق الخاصة" ، والتي تسمح للفصول بتحديد سلوكها فيما يتعلق بمشغلي اللغات القياسية. يمكن أن تكون التعبيرات التالية مثالًا على عوامل تشغيل اللغات هذه:


  • x > y
  • x[ i ]

يدعم Python 3 العديد من هذه الطرق ، ويمكن الاطلاع على قائمة كاملة على صفحة وثائق اللغة الرسمية. __init__ (مهيئ) هو الأكثر استخدامًا منهم ويبدأ عند إنشاء كائن فئة جديد. الآخر ، __lt__ (مقارنة متقدمة) ، يحدد قواعد لمقارنة كائنين من فئة المستخدم. لا تندرج هذه الأساليب في فئة "خاص" أو "عام" ، لأنها تخدم أغراضًا أخرى وترسخ بعمق في البنية الداخلية للغة.


 #!/usr/bin/python3 class Phone: def __init__(self, number): # magic method / inititalizer print( "The Phone object was created" ) self.number = number def __lt__(self, other): # magic method / rich comparison return self.number < other.number my_phone = Phone(20) other_phone = Phone(30) if my_phone < other_phone: print( "Two instances of custom class were compared" ) print( "'__lt__' was called implicitly" ) if my_phone.__lt__(other_phone): print( "Now, '__lt__' was used explicitly" ) input( "Press Enter to exit" ) 

يمكن استدعاء الأساليب السحرية من قبل أي مستخدم بنفس طريقة استخدام أي طريقة عامة في Python ، ولكن الغرض منها استخدامها ضمنيًا في حالاتهم الخاصة. حالة خاصة للأسلوب __init__ هي تهيئة كائن فئة جديدة. __lt__ يستخدم لمقارنة كائنين.


استنتاج


لا يوفر Python3 وصولاً محدودًا إلى أي متغيرات أو طرق فئة. يمكن في الواقع قراءة البيانات التي يجب إخفاؤها وتعديلها. في Python3 ، يعد التغليف عبارة عن اتفاقية ، ويجب أن يتولى المبرمج الحفاظ عليها بمفرده.


مصادر


  1. جون سي ميتشل ، مفاهيم في لغات البرمجة
  2. روبرت سي مارتن ، الهندسة المعمارية النظيفة ، دليل الحرفي لهيكل البرمجيات والتصميم

Source: https://habr.com/ru/post/ar444338/


All Articles