القائمة الرئيسية

الصفحات

دورة البرمجة بلغة بايثون - الدرس الخامس والثلاثون (الكلاسات)

دورة البرمجة بلغة بايثون - الدرس الخامس والثلاثون (الكلاسات)

دورة البرمجة بلغة بايثون - الدرس الخامس والثلاثون (الكلاسات)

بايثون هي لغة برمجة موجهة للكائنات. على عكس البرمجة الموجهة نحو الإجراءات ، حيث يكون التركيز الرئيسي على الوظائف ، فإن البرمجة الموجهة للكائنات تركز على الكائنات.


الكائن هو ببساطة مجموعة من البيانات (المتغيرات) والطرق (الدوال) التي تعمل على تلك البيانات. وبالمثل ، فإن الطبقة هي مخطط لهذا الكائن.


يمكننا التفكير في الفصل على أنه رسم تخطيطي (نموذج أولي) للمنزل. يحتوي على جميع التفاصيل حول الأرضيات والأبواب والنوافذ وما إلى ذلك بناءً على هذه الأوصاف نقوم ببناء المنزل. البيت هو الموضوع.


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


تحديد الكلاس في بايثون

مثل تعريفات الوظائف تبدأ بالكلمة الأساسية def في بايثون ، تبدأ تعريفات الفئة بكلمة class.


تسمى السلسلة الأولى داخل الكلاس docstring ولها وصف موجز عن الكلاس . على الرغم من أنه ليس إلزاميًا ، إلا أنه موصى به بشدة.


هنا تعريف فئة بسيط.

class MyNewClass:
    '''This is a docstring. I have created a new class'''
    pass

تقوم الفئة بإنشاء مساحة اسم محلية جديدة حيث يتم تحديد جميع سماتها. قد تكون السمات بيانات أو دوال.


هناك أيضًا سمات خاصة تبدأ بشرطة سفلية مزدوجة __. على سبيل المثال ، __doc__ يعطينا docstring لتلك الفئة.


بمجرد تحديد فئة ، يتم إنشاء كائن فئة جديد بنفس الاسم. يسمح لنا كائن الفئة هذا بالوصول إلى السمات المختلفة وكذلك إنشاء كائنات جديدة لتلك الفئة.

class Person:
    "This is a person class"
    age = 10

    def greet(self):
        print('Hello')


# Output: 10
print(Person.age)

# Output: <function Person.greet>
print(Person.greet)

# Output: 'This is my second class'
print(Person.__doc__)

الناتج

10
<function Person.greet at 0x7fc78c6e8160>
This is a person class


إنشاء كائن في بايثون

رأينا أنه يمكن استخدام كائن الكلاس للوصول إلى سمات مختلفة.


يمكن استخدامه أيضًا لإنشاء مثيلات كائن جديدة (إنشاء مثيل) لتلك الفئة. يشبه إجراء إنشاء كائن استدعاء دالة.

>>> harry = Person()


سيؤدي هذا إلى إنشاء مثيل كائن جديد باسم harry. يمكننا الوصول إلى سمات الكائنات باستخدام بادئة اسم الكائن.


قد تكون السمات بيانات أو دوال. طرق الكائن هي وظائف مقابلة لتلك الفئة.


هذا يعني القول ، نظرًا لأن Person.greet هو كائن وظيفي (سمة من سمات الفئة) ، فإن Person.greet سيكون كائنًا أسلوبًا.

class Person:
    "This is a person class"
    age = 10

    def greet(self):
        print('Hello')


# create a new object of Person class
harry = Person()

# Output: <function Person.greet>
print(Person.greet)

# Output: <bound method Person.greet of <__main__.Person object>>
print(harry.greet)

# Calling object's greet() method
# Output: Hello
harry.greet()


الناتج:

<function Person.greet at 0x7fd288e4e160>
<bound method Person.greet of <__main__.Person object at 0x7fd288e9fa30>>
Hello


ربما تكون قد لاحظت المعلمة الذاتية في تعريف الوظيفة داخل الفئة ولكننا أطلقنا عليها ببساطة اسم ()harry.greet  بدون أي وسيطات. ولا تزال تعمل.


هذا لأنه عندما يستدعي الكائن طريقته ، يتم تمرير الكائن نفسه باعتباره الوسيطة الأولى. لذلك ، يترجم ()harry.greet إلى Person.greet (هاري).


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


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


الآن يجب أن تكون على دراية بكائن الفئة ، كائن المثال ، كائن الوظيفة ، كائن الأسلوب والاختلافات بينهما.


البناة Constructors في بايثون

وظائف الفئة التي تبدأ بشرطة سفلية مزدوجة __ تسمى وظائف خاصة لأنها لها معنى خاص.


من بين الاهتمامات الخاصة وظيفة ()__init __. يتم استدعاء هذه الوظيفة الخاصة كلما تم إنشاء كائن جديد من تلك الفئة.


يسمى هذا النوع من الوظائف أيضًا المنشئات في البرمجة الشيئية (OOP). نستخدمها عادة لتهيئة جميع المتغيرات.

class ComplexNumber:
    def __init__(self, r=0, i=0):
        self.real = r
        self.imag = i

    def get_data(self):
        print(f'{self.real}+{self.imag}j')


# Create a new ComplexNumber object
num1 = ComplexNumber(2, 3)

# Call get_data() method
# Output: 2+3j
num1.get_data()

# Create another ComplexNumber object
# and create a new attribute 'attr'
num2 = ComplexNumber(5)
num2.attr = 10

# Output: (5, 0, 10)
print((num2.real, num2.imag, num2.attr))

# but c1 object doesn't have attribute 'attr'
# AttributeError: 'ComplexNumber' object has no attribute 'attr'
print(num1.attr)


الناتج

2+3j
(5, 0, 10)
Traceback (most recent call last):
  File "<string>", line 27, in <module>
    print(num1.attr)
AttributeError: 'ComplexNumber' object has no attribute 'attr'

في المثال أعلاه ، حددنا فئة جديدة لتمثيل الأعداد المركبة. لها وظيفتان ، ()__init __  لتهيئة المتغيرات (الافتراضيات إلى الصفر) و ()get_data لعرض الرقم بشكل صحيح.


شيء مثير للاهتمام يجب ملاحظته في الخطوة أعلاه هو أنه يمكن إنشاء سمات كائن وقت التنفيذ. أنشأنا سمة جديدة للكائن رقم 2 وقرأناها أيضًا. لكن هذا لا يُنشئ تلك السمة للكائن رقم 1.


حذف السمات والكائنات

يمكن حذف أي سمة من سمات الكائن في أي وقت ، باستخدام عبارة del. جرب ما يلي لترى الناتج.

>>> num1 = ComplexNumber(2,3)
>>> del num1.imag
>>> num1.get_data()
Traceback (most recent call last):
...
AttributeError: 'ComplexNumber' object has no attribute 'imag'

>>> del ComplexNumber.get_data
>>> num1.get_data()
Traceback (most recent call last):
...
AttributeError: 'ComplexNumber' object has no attribute 'get_data'


يمكننا حتى حذف الكائن نفسه ، باستخدام عبارة del.

>>> c1 = ComplexNumber(1,3)
>>> del c1
>>> c1
Traceback (most recent call last):
...
NameError: name 'c1' is not defined


في الواقع ، الأمر أكثر تعقيدًا من ذلك. عندما نفعل c1 = ComplexNumber (1،3) ، يتم إنشاء كائن مثيل جديد في الذاكرة ويرتبط الاسم c1 به.


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


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

حذف الكائن في بايثون


يؤدي حذف الكائنات في بايثون إلى إزالة ربط الاسم.

reaction:
Ahmed Taher
Ahmed Taher
مدون من العراق . احب البرمجة وكل ما يتعلق بالشبكات والسيرفرات وامن المعلومات . واسعى الى توفير جميع المصادر والمواد للامتحانات الدولية.

تعليقات