classmethods Python

Содержание
Введение
Пример
Класс метод как альтернативный конструктор
Похожие статьи

Введение

Это продолжение статьи «Классы» из раздела «ООП в Python» .

Здесь вы можете прочитаь про classmethods

Обычные, иначе говоря, instance методы вы можете изучить здесь , статические здесь

Рекомендую также изучить статью «Декораторы в Python»

Пример

Класс методы принимают в качестве аргумента не объект класса, а сам класс.

# Class Methods part 1. Total 8 class Employee: num_of_emps = 0 raise_amt = 1.04 def __init__(self, first, last, pay): self.first = first self.last = last self.pay = pay self.email = first + '.' + last + '@company.com' Employee.num_of_emps += 1 def fullname(self): return f'{self.first} {self.last}' def apply_raise(self): self.pay = int(self.pay * self.raise_amt) # regular method automatically takes an instance as an argument # by convention it is called 'self' # class method takes class as an argument @classmethod def set_raise_amt(cls, amount): cls.raise_amt = amount emp_1 = Employee('Balda', 'Worker', 50000) emp_2 = Employee('Test', 'User', 60000) print(Employee.raise_amt) # 1.04 print(emp_1.raise_amt) # 1.04 print(emp_2.raise_amt) # 1.04 Employee.set_raise_amt(1.05) print(Employee.raise_amt) # 1.05 print(emp_1.raise_amt) # 1.05 print(emp_2.raise_amt) # 1.05 # Можно применить класс метод к объекту # изменения будут для всего класса а не только # для этого объекта. Поэтому смысла так делать нет. # В следующем примере применим к emp_1 и убедимся что 1.06 станет у всех emp_1.set_raise_amt(1.06) print(Employee.raise_amt) # 1.06 print(emp_1.raise_amt) # 1.06 print(emp_2.raise_amt) # 1.06

python classmethod_example.py

1.04 1.04 1.04 1.05 1.05 1.05 1.06 1.06 1.06

Класс метод как альтернативный конструктор

Если вам нужно получить данные из внешнего источника, например импортируете из .csv файла и потом создать из них объекты, возможно этот способ подойдёт.

Предположим, данные приходят в виде строк, где значения разделены с помощью -

emp_str_1 = 'John-Doe-70000' emp_str_2 = 'Steve-Smith-30000' emp_str_3 = 'Jane-Doe-90000' first, last, pay = emp_str_1.split('-') new_emp_1 = Employee(first, last, pay) print(new_emp_1.email) print(new_emp_1.pay)

python classmethod_example.py

John.Doe@company.com 70000

Чтобы ускорить создание объектов можно написать класс метод

@classmethod def from_string(cls, emp_str): first, last, pay = emp_str.split('-') return cls(first, last, pay) emp_str_1 = 'John-Doe-70000' new_emp_1 = Employee.from_string(emp_str_1) print(new_emp_1.email) print(new_emp_1.pay)

python classmethod_example.py

John.Doe@company.com 70000

Похожий пример можно увидеть в библиотеке datetime

class date: """Concrete date type. Constructors: __new__() fromtimestamp() today() fromordinal() Operators: __repr__, __str__ __eq__, __le__, __lt__, __ge__, __gt__, __hash__ __add__, __radd__, __sub__ (add/radd only with timedelta arg) Methods: timetuple() toordinal() weekday() isoweekday(), isocalendar(), isoformat() ctime() strftime() Properties (readonly): year, month, day """ __slots__ = '_year', '_month', '_day', '_hashcode' def __new__(cls, year, month=None, day=None): """Constructor. Arguments: year, month, day (required, base 1) """ if (month is None and isinstance(year, (bytes, str)) and len(year) == 4 and 1 <= ord(year[2:3]) <= 12): # Pickle support if isinstance(year, str): try: year = year.encode('latin1') except UnicodeEncodeError: # More informative error message. raise ValueError( "Failed to encode latin1 string when unpickling " "a date object. " "pickle.load(data, encoding='latin1') is assumed.") self = object.__new__(cls) self.__setstate(year) self._hashcode = -1 return self year, month, day = _check_date_fields(year, month, day) self = object.__new__(cls) self._year = year self._month = month self._day = day self._hashcode = -1 return self # Additional constructors @classmethod def fromtimestamp(cls, t): "Construct a date from a POSIX timestamp (like time.time())." y, m, d, hh, mm, ss, weekday, jday, dst = _time.localtime(t) return cls(y, m, d) …

Как видно из этого отрывка кода - у класса date есть основной конструктор __new__() и несколько дополнительных.

На примере дополнительного конструктора fromtimestamp видно, что он реализован с помощью декоратора classmethod

Похожие статьи
ООП в Python
Классы
Методы
class variables
class methods
Статические методы
Наследование
Специальные методы
dataclass
__slots__
Декоратор property
super()

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: