Перейти к содержанию

Шпаргалка по классам

class <name>:
    def __init__(self, a):
        self.a = a

    def __repr__(self):
        class_name = self.__class__.__name__
        return f'{class_name}({self.a!r})'

    def __str__(self):
        return str(self.a)

    @classmethod
    def get_class_name(cls):
        return cls.__name__
  • Функция repr() возвращает готовую сигнатуру класса
  • Функция str() возвращает читаемое описание
  • Если определена только repr(), то она будет использована и вместо str()

Где используется str():

print(<el>)
f'{<el>}'
logging.warning(<el>)
csv.writer(<file>).writerow([<el>])
raise Exception(<el>)

Где используется Repr():

print/str/repr([<el>])
f'{<el>!r}'
Z = dataclasses.make_dataclass('Z', ['a']); print/str/repr(Z(<el>))
>>> <el>

Конструктор класса

class <name>:
    def __init__(self, a=None):
        self.a = a

Наследование

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age  = age

class Employee(Person):
    def __init__(self, name, age, staff_num):
        super().__init__(name, age)
        self.staff_num = staff_num

Множественное наследование

class A: pass
class B: pass
class C(A, B): pass

MRO (method resolution order, порядок разрешения методов) определяет в каком порядке будет идти обход родительских классы, чтобы найти искомый метод:

>>> C.mro()
[<class 'C'>, <class 'A'>, <class 'B'>, <class 'object'>]

Свойства

Как в Python реализован протокол геттеры и сеттеры (getters и setters).

class Person:

    @property
    def name(self):
        return ' '.join(self._name)

    @name.setter
    def name(self, value):
        self._name = value.split()
>>> person = Person()
>>> person.name = '\t Человек  Утюг \n'
>>> person.name
'Человек Утюг'

Dataclass

Декоратор класса, который автоматически генерирует методы init(), repr() и eq() и другие специальные методы для классов.

from dataclasses import dataclass, field

@dataclass(order=False, frozen=False)
class <class_name>:
    <attr_name_1>: <type>
    <attr_name_2>: <type> = <default_value>
    <attr_name_3>: list/dict/set = field(default_factory=list/dict/set)
  • Объекты могут быть сортируемыми если указать 'order=True' и имутабельными если указать 'frozen=True'.
  • Чтобы объект был хэшируемым, все атрибуты должны быть хэшируемыми и 'frozen' должно быть True
  • Функция field() необходима, потому что '[attr_name]: list = []' создаст список, который будет общим для всех экземпляров. Ее аргумент 'default_factory' может быть любым исполняемым (callable).
  • Для атрибутов произвольного типа используйте 'typing.Any'.

Легковестная форма dataclass

from dataclasses import make_dataclass
<class> = make_dataclass('<class_name>', <coll_of_attribute_names>)
<class> = make_dataclass('<class_name>', <coll_of_tuples>)
<tuple> = ('<attr_name>', <type> [, <default_value>])

Слоты __slots__

По умолчанию классы ведут себя образом похожим на словари, в которых вы можете добавлять ключи и удалять. Если вы хотите существенно уменьшить объем памяти которые занимают экземпляры классов и вам не нужны динамические свойства, то используйте слоты. Они ограничивают список возможных свойств только теми ключами, которые перечислены в списке:

class MyClassWithSlots:
    __slots__ = ['a']

    def __init__(self):
        self.a = 1