English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

دليل أساسي لـ Python

تحكم في عملية Python

الوظائف في Python

نوع البيانات في Python

عمليات ملفات Python

عناصر وفئات Python

تاريخ Python ووقت

معرفة متقدمة في Python

دليل Python

استخدام طريقة classmethod() في Python واستخدام الأمثلة

وظائف داخليه بايثون

يستعيد طريقة classmethod() طريقة الفئة للدالة المقدمة.

نحو طريقة classmethod()

classmethod(function)

يعتبر decorateur @classmethod غير متوافق مع معايير Python، لذا يمكن استخدام @classmethod decorator لتعريف طريقة الفئة في إصدارات Python الجديدة.

النحو هو:

@classmethod
def func(cls, args...)

معاملات classmethod()

يأخذ طريقة classmethod() معاملًا واحدًا:

  • function-الدالة التي تحتاج إلى تحويل إلى طريقة الفئة

قيمة عودة classmethod()

يستعيد طريقة classmethod() طريقة الفئة للدالة المقدمة.

ما هو طريقة الفئة؟

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

الفرق بين طريقة الهدوء وطريقة الفئة هو:

  • طريقة الهدوء لا تعلم شيئًا عن الفئة، بل تتعامل فقط مع المعاملات

  • يستخدم طريقة الفئة مع الفئة لأن معاملاتها دائمًا هي الفئة نفسها.

يمكن دعوة طريقة الفئة من قبل الفئة نفسها ومن خلال العنصر

Class.classmethod()
أو حتى
Class().classmethod()

لكن على أي حال، دائمًا ما يتم تثبيت طريقة الفئة على الفئة نفسها، لأن الفئة نفسها هيcls.

def classMethod(cls, args...)

مثال 1: استخدامهم(classmethod() لإنشاء طريقة فئة

class Person:
    age = 25
    def printAge(cls):
        print('العمر هو:', cls.age)
# create printAge class method
Person.printAge = classmethod(Person.printAge)
Person.printAge()

عند تشغيل هذا البرنامج، الناتج سيكون:

العمر هو: 25

في هذا السياق، لدينا class Person، يحتوي على متغيرات الأعضاءالعمرتم تحديدها على 25.

نحن نملك أيضًا دالة printAge، التي تأخذ فقط معاملًا واحدًا cls، وليس self كما نستخدم عادةً.

clsتقبل كائن الفئة Person كمعامل، وليس كمعامل/مثال على Person.

الآن، سنقوم بتقديم هذه الطريقة Person.printAge كمعامل للوظيفة classmethod. سيقوم هذا بتحويل الطريقة إلى طريقة فئوية، مما يسمح لها باستقبال المعامل الأول كفئة (أي Person).

في السطر الأخير، لم يتم إنشاء كائن Person باستخدام printAge مثل الطريقة الثابتة. سيقوم الطباعة بكائن المتغيرالعمر.

متى تستخدم الطريقة الفئوية؟

1. طريقة المصنع

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

انه مشابه لـ overload function في C++. لأن Python لا يملك هذه الميزة، لذا تم استخدام الطريقة الفئوية والطريقة الثابتة.

مثال 2: إنشاء طريقة المصنع باستخدام الطريقة الفئوية

from datetime import date
# random Person
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    @classmethod
    def fromBirthYear(cls, name, birthYear):
        return cls(name, date.today().year - birthYear)
    def display(self):
        print(self.name + 's age is: ' + str(self.age))
person = Person('Adam', 19)
person.display()
person1 = Person.fromBirthYear('John', 1985)
person1.display()

عند تشغيل هذا البرنامج، الناتج سيكون:

العمر لـ Adam هو: 19
العمر لـ John هو: 31

في هذا المثال، لدينا طريقتان لإنشاء مثال فئوي، بناء الطريقة والطريقة fromBirthYear.

يستخدم البناء المعاملات التقليديةالاسموالعمر. بينما يستخدم fromBirthYearcls،الاسموbirthYear، بحساب العمر الحالي من خلال طرح السنة الحالية عن العمر الحالي، وتقديم مثال فئوي.

طريقة fromBirthYear تأخذ فئة Person (ليس مثالاً على Person) كمعامل أولcls،ومن خلال استدعاء العودة إلى بناء الطريقة cls(name, date.today().year - birthYear)، هذا يعادل Person(name, date.today().year - birthYear)

قبل هذه الطريقة، رأينا @classmethod. يُدعى هذامزيل،طريقة فئوية تستخدم لتحويل fromBirthYear إلى classmethod()

2. إنشاء المثال بشكل صحيح في الوراثة

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

يمكنك إنشاء طريقة ثابتة للنموذج أعلاه، لكن الجسم الذي تخلقه سيكون دائمًا مبرمجًا كفئة Base.

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

مثال 3: كيف تعمل الطريقة الفئوية للاستنساخ؟

from datetime import date
# random Person
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    @staticmethod
    def fromFathersAge(name, fatherAge, fatherPersonAgeDiff):
        return Person(name, date.today().year - fatherAge + fatherPersonAgeDiff)
    @classmethod
    def fromBirthYear(cls, name, birthYear):
        return cls(name, date.today().year - birthYear)
    def display(self):
        print(self.name + 's age is: ' + str(self.age))
class Man(Person):
    sex = 'Male'
man = Man.fromBirthYear('John', 1985)
print(isinstance(man, Man))
man1 = Man.fromFathersAge('John', 1965, 20)
print(isinstance(man1, Man))

عند تشغيل هذا البرنامج، الناتج سيكون:

True
False

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

هذا سيؤدي بالتأكيد إلى مشكلة عندما يرث Person من Man.

لا يرجع منحنى من نوع Man، بل من نوع Person الأساسي.

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

وظائف داخليه بايثون