classmethod() у Python

The classmethod() це вбудована функція в Python, яка повертає метод класу для заданої функції.

classmethod() у синтаксисі Python

Синтаксис: метод класу (функція)

Параметр: Ця функція приймає назву функції як параметр.

Тип повернення: Ця функція повертає перетворений метод класу.

Функція Python classmethod().

Методи classmethod() прив’язані до класу, а не до об’єкта. Методи класу можуть викликатися як класом, так і об’єктом. Ці методи можна викликати за допомогою класу або об’єкта.

Метод класу проти статичного методу

Основна відмінність між метод класу проти статичного методу в Python і коли використовувати метод класу та статичний метод Python .

  • Метод класу приймає cls як перший параметр, тоді як статичний метод не потребує конкретних параметрів.
  • Метод класу може отримати доступ або змінити стан класу, тоді як статичний метод не може отримати доступ або змінити його.
  • Загалом, статичні методи нічого не знають про стан класу. Це методи утилітного типу, які приймають деякі параметри та працюють з ними. З іншого боку, методи класу повинні мати клас як параметр.
  • Ми використовуємо декоратор @classmethod у Python для створення методу класу, а декоратор @staticmethod — для створення статичного методу в Python.

Приклад методу класу в Python

Створіть простий метод класу

У цьому прикладі ми побачимо, як створити метод класу в Python. Для цього ми створили клас під назвою Geeks зі змінною-членом course і створили функцію під назвою purchase, яка друкує об’єкт. Тепер ми пройшли метод Geeks.purchase> у метод класу за допомогою @classmethod> декоратор, який перетворює метод на метод класу. За допомогою методу класу ми можемо викликати функцію buy ​​без створення об’єкта функції, безпосередньо використовуючи назву класу Geeks.

Python3




class> geeks:> > course> => 'DSA'> > def> purchase(obj):> > print> (> 'Purchase course : '> , obj.course)> geeks.purchase> => classmethod> (geeks.purchase)> geeks.purchase()>

Вихід

Purchase course : DSA 

Створіть метод класу за допомогою classmethod()

Створено print_name classmethod перед створенням цього рядка print_name() Його можна викликати лише з об’єктом, а не з класом, тепер цей метод можна викликати як classmethod. Метод print_name() називається методом класу.

Python3




class> Student:> > # create a variable> > name> => 'Geeksforgeeks'> > # create a function> > def> print_name(obj):> > print> (> 'The name is : '> , obj.name)> # create print_name classmethod> # before creating this line print_name()> # It can be called only with object not with class> Student.print_name> => classmethod> (Student.print_name)> # now this method can be called as classmethod> # print_name() method is called a class method> Student.print_name()>

Вихід

The name is : Geeksforgeeks 

Фабричний метод із використанням методу класу

Використання функції classmethod() використовується у фабричних шаблонах проектування, де ми хочемо викликати багато функцій за допомогою імені класу, а не об’єкта.

Python3




# Python program to demonstrate> # use of a class method and static method.> from> datetime> import> date> class> Person:> > def> __init__(> self> , name, age):> > self> .name> => name> > self> .age> => age> > # a class method to create a> > # Person object by birth year.> > @classmethod> > def> fromBirthYear(> cls> , name, year):> > return> cls> (name, date.today().year> -> year)> > def> display(> self> ):> > print> (> 'Name : '> ,> self> .name,> 'Age : '> ,> self> .age)> person> => Person(> 'mayank'> ,> 21> )> person.display()>

Вихід

Name : mayank Age : 21 

Як метод класу працює для успадкування?

У цьому прикладі ми створюємо ієрархію класів Python із двома класами, Person> і Man> і демонструє використання методів класу та успадкування.

Python3




from> datetime> import> date> # random Person> class> Person:> > def> __init__(> self> , name, age):> > self> .name> => name> > self> .age> => age> > @staticmethod> > def> from_FathersAge(name, fatherAge, fatherPersonAgeDiff):> > return> Person(name, date.today().year> -> fatherAge> +> fatherPersonAgeDiff)> > @classmethod> > def> from_BirthYear(> 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> => 'Female'> man> => Man.from_BirthYear(> 'John'> ,> 1985> )> print> (> isinstance> (man, Man))> man1> => Man.from_FathersAge(> 'John'> ,> 1965> ,> 20> )> print> (> isinstance> (man1, Man))>

Вихід

True False 

Декоратор Python @classmethod

Декоратор @classmethod є вбудованим декоратор функції це вираз, який обчислюється після визначення вашої функції. Результат цієї оцінки затьмарює ваше визначення функції. Метод класу отримує клас як неявний перший аргумент, так само як метод екземпляра отримує екземпляр.

Синтаксис методу класу Decorator

клас C (об'єкт):

@classmethod

def fun(cls, arg1, arg2, …):

….

Де,

  • весело: функція, яку потрібно перетворити на метод класу
  • повертає: метод класу для функції.

Примітка:

  • Метод класу — це метод, який прив’язаний до класу, а не до об’єкта класу.
  • Вони мають доступ до стану класу, оскільки він приймає параметр класу, який вказує на клас, а не на екземпляр об’єкта.
  • Він може змінювати стан класу, який застосовуватиметься до всіх екземплярів класу. Наприклад, він може змінити змінну класу, яка буде застосовна до всіх екземплярів.

приклад

У наведеному нижче прикладі ми використовуємо staticmethod() і classmethod(), щоб перевірити, чи є особа дорослою чи ні.

Python3




# Python program to demonstrate> # use of a class method and static method.> from> datetime> import> date> class> Person:> > def> __init__(> self> , name, age):> > self> .name> => name> > self> .age> => age> > # a class method to create a> > # Person object by birth year.> > @classmethod> > def> fromBirthYear(> cls> , name, year):> > return> cls> (name, date.today().year> -> year)> > # a static method to check if a> > # Person is adult or not.> > @staticmethod> > def> isAdult(age):> > return> age>> 18> person1> => Person(> 'mayank'> ,> 21> )> person2> => Person.fromBirthYear(> 'mayank'> ,> 1996> )> print> (person1.age)> print> (person2.age)> # print the result> print> (Person.isAdult(> 22> ))>

Вихід

21 27 True