English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في هذا المقال، ستتعلم عن الوظائف الأساسية لبايثون، الأجسام والفئات. ستتعلم ما هي الفئة وكيفية إنشائها واستخدامها في البرنامج.
بايثون هو لغة برمجة معتمدة على الأجسام. تركز تصميم العمليات على الدوال، بينما يركز تصميم الأجسام على الأجسام.
الجسم هو مجموعة من البيانات (المتغيرات) والأساليب التي تؤثر على هذه البيانات (الوظائف). وقد تكون الفئة هي خطة الجسم.
يمكننا اعتبار الفئة رسمًا لخطة المنزل (النموذج). يحتوي على جميع التفاصيل المتعلقة بالأرضيات، الأبواب، النوافذ وما إلى ذلك. بناءً على هذه التوصيفات، قمنا ببناء المنازل. المنزل هو الجسم.
بما أن يمكننا إنشاء العديد من المنازل من خلال الوصف، يمكننا إنشاء العديد من الأجسام بناءً على الفئة. الجسم هو مثال على الفئة، ويعرف عملية إنشاء هذا الجسم بـالنمذجة.
مثل تعريف الدالة باستخدام الكلمة المفتاحيةdefالبداية متشابهة، في بايثون، نستخدم الكلمات المفتاحيةclassتعريفالفئة.
السطر الأول يُدعى docstring ويكون وصفًا مختصرًا للفئة. على الرغم من أنه ليس إلزاميًا، إلا أن من الأفضل القيام بذلك.
هذا هو تعريف فئة بسيط.
class MyNewClass: '''هذا نص الوثيقة. لقد أنشأت فئة جديدة''' pass
إنشاء فئة يخلق نطاقًا جديدًا محليًاالنطاق، ويتم تعريفها فيها جميع الخصائص. يمكن أن تكون الخصائص بيانات أو وظائف.
وهناك بعض الخصائص الخاصة، التي تبدأ بـ __. على سبيل المثال، __doc__ يعطينا نص الوثيقة للفئة.
بمجرد تعريف فئة، سيتم إنشاء كائن فئة جديد يحمل نفس الاسم. هذا كائن الفئة يتيح لنا الوصول إلى الخصائص المختلفة وتنمذجة كائنات جديدة من الفئة.
class MyClass: "هذا فصلي الثاني" a = 10 def func(self): print('Hello') # الناتج: 10 print(MyClass.a) # الناتج: <function MyClass.func at 0x0000000003079BF8> print(MyClass.func) # الناتج: 'هذا فصلي الثاني' print(MyClass.__doc__)
عند تشغيل البرنامج، الناتج هو:
10 <function 0x7feaa932eae8="" at="" myclass.func=""> هذا فصلي الثاني
رأينا أن كائن الفئة يمكن استخدامه للاستعلام عن الخصائص المختلفة.
يمكن استخدامها أيضًا لإنشاء مثال جديد للفئة (النمذجة). عملية إنشاء الكائن تشبهالوظيفةالإشارة.
>>> ob = MyClass()
سيتم إنشاء مثال جديد. يمكننا الوصول إلى خصائص الكائن باستخدام ناقص اسم الكائن.
الصفات يمكن أن تكون بيانات أو طرق. الطريقة للكائن هي الدالة المماثلة للفئة. أي وظيفة كائن للصفة تعين طريقة للفئة.
这意味着، بسبب أن MyClass.func هو كائن وظيفة (صفة الفئة)، سيكون ob.func كائن وظيفة.
class MyClass: "هذا فصلي الثاني" a = 10 def func(self): print('Hello') # إنشاء مثال جديد من MyClass ob = MyClass() # الناتج: <function MyClass.func at 0x000000000335B0D0> print(MyClass.func) # الناتج: <bound method MyClass.func of <__main__.MyClass object at 0x000000000332DEF0>> print(ob.func) # Calling function func() # Output: Hello ob.func()
You may have noticed the self parameter in the function definition inside the class, but we just call this method by the abbreviation ob.func(), without anyParameters. It is still valid.
This is because, as long as the object calls its method, the object itself is passed as the first parameter. Therefore, ob.func() automatically converts to MyClass.func(ob).
Generally, calling a method with a list of n parameters is equivalent to calling a function with a list of parameters created by inserting the method's object before the first parameter.
For these reasons, the first parameter of the function in the class must be the object itself. This is usually calledself. You can use other names, but we strongly recommend that you follow the conventions.
Now, you must be familiar with class objects, instance objects, function objects, method objects, and their differences.
Functions that start with double underscores (__ ) are called special functions because they have special meanings.
__init__() function is particularly useful. It is called every time a new object of the class is instantiated.
This type of function in object-oriented programming (OOP) is also called a constructor. We usually use it to initialize all variables.
class ComplexNumber: def __init__(self, r = 0, i = 0): self.real = r self.imag = i def getData(self): print("{0}+{1}j".format(self.real,self.imag)) # Create a new ComplexNumber object c1 = ComplexNumber(2,3) # Calling getData() function # Output: 2+3j c1.getData() # Create another ComplexNumber object # And create a new attribute 'attr' c2 = ComplexNumber(5) c2.attr = 10 # Output: (5, 0, 10) print((c2.real, c2.imag, c2.attr)) # But the c1 object does not have an attribute 'attr' # AttributeError: 'ComplexNumber' object has no attribute 'attr' c1.attr
في المثال السابق، قمنا بتعريف فئة جديدة لتمثيل المركب. إنها تحتوي على اثنين من الدوال، وهي __init__() لتحديد المتغيرات (بافتراض الصفر)، وgetData() لعرض الرقم بشكل صحيح.
من الملاحظات المثيرة في الخطوات السابقة أننا يمكننا إنشاء خصائص الجسم بشكل ديناميكي. أنشأنا خاصية جديدة attr لجسم c2 وقرأناها. ولكن لم يتم إنشاء هذه الخاصية للجسم c1.
يمكننا استخدام جملة del في أي وقت لإزالة أي خاصية من الجسم. حاول أداء العمليات التالية في بيئة Python Shell لرؤية الناتج.
>>> c1 = ComplexNumber(2,3) >>> del c1.imag >>> c1.getData() Traceback (most recent call last): ... AttributeError: 'ComplexNumber' object has no attribute 'imag' >>> del ComplexNumber.getData >>> c1.getData() Traceback (most recent call last): ... AttributeError: 'ComplexNumber' object has no attribute 'getData'
يمكننا حتى استخدام جملة 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لكن، يستمر هذا الجسم في وجوده في الذاكرة، إذا لم يكن هناك أي ارتباطات باسمية أخرى، فإن هذا الجسم سيتم تدميره تلقائيًا لاحقًا.
في Python، يُسمى هذا التدمير التلقائي للأجسام غير المستخدمة أيضًا إعادة التدوير النفايات.