Шпаргалка по классам
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