English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
يستعيد طريقة classmethod() طريقة الفئة للدالة المقدمة.
نحو طريقة classmethod()
classmethod(function)
يعتبر decorateur @classmethod غير متوافق مع معايير Python، لذا يمكن استخدام @classmethod decorator لتعريف طريقة الفئة في إصدارات Python الجديدة.
النحو هو:
@classmethod def func(cls, args...)
يأخذ طريقة classmethod() معاملًا واحدًا:
function-الدالة التي تحتاج إلى تحويل إلى طريقة الفئة
يستعيد طريقة classmethod() طريقة الفئة للدالة المقدمة.
طريقة الفئة هي طريقة مرتبطة بالفئة وليس بالعنصر. لا تحتاج إلى إنشاء مثال على الفئة، مثلclassmethod(طريقة هادئة)مثل.
الفرق بين طريقة الهدوء وطريقة الفئة هو:
طريقة الهدوء لا تعلم شيئًا عن الفئة، بل تتعامل فقط مع المعاملات
يستخدم طريقة الفئة مع الفئة لأن معاملاتها دائمًا هي الفئة نفسها.
يمكن دعوة طريقة الفئة من قبل الفئة نفسها ومن خلال العنصر
Class.classmethod() أو حتى Class().classmethod()
لكن على أي حال، دائمًا ما يتم تثبيت طريقة الفئة على الفئة نفسها، لأن الفئة نفسها هيcls.
def classMethod(cls, args...)
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 مثل الطريقة الثابتة. سيقوم الطباعة بكائن المتغيرالعمر.
هي طرق المصنع التي تعود إلى كائنات فئة (مثل بناء الطريقة) للاستخدامات المختلفة.
انه مشابه لـ overload function في C++. لأن Python لا يملك هذه الميزة، لذا تم استخدام الطريقة الفئوية والطريقة الثابتة.
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()
عندما يتم تنفيذ طريقة المصنع كطريقة فئوية للاستنساخ فئة، يمكنها دائمًا التأكد من إنشاء مثال صحيح للفئة الفرعية.
يمكنك إنشاء طريقة ثابتة للنموذج أعلاه، لكن الجسم الذي تخلقه سيكون دائمًا مبرمجًا كفئة Base.
لكن، عندما تستخدم الطريقة الفئوية، فإنها تخلق مثالاً صحيحاً للفئة الفرعية.
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. يمكن التأكد من أن الكود موجه الأشياء باستخدام طريقة من نوع من السنة من الميلاد، لأنها تستخدم أول معامل كفئة نفسها وتقوم بتشغيل طريقة المصنع الخاصة بها.