Создание простого класса с атрибутами класса setattr(class_name or object_name, ‘attr_name’, value) - функция позволяет добавить/обновить атрибут с указанным значением getattr(class_name or object_name, ‘attr_name’, True or False) - функция позволяет получить значение указанного атрибута. Если стоит False, то при отсутствии указанного атрибута не выпадет ошибка. hasattr(class_name or object_name, ‘attr_name’) - функция позволяет узнать существует ли указанный атрибут. Возвращает булевое значение. delattr(class_name or object_name, ‘attr_name’) - функция позволяет удалить выбранный атрибут, если такой существует. Иначе выпадет ошибка. __doc__ - содержит строку с описанием класса __dict__ - содержит набор атрибутов и их значений в экземпляре класса Объекты класса образуют свое пространство имен – пространство имен экземпляров класса. Объекты не содержат никаких собственных атрибутов. Свойства класса принадлежат непосредственно классу Point и находятся в нем, а объекты a и b лишь имеют ссылки на эти атрибуты класса. То есть, атрибуты класса – общие для всех его экземпляров. Для создания поля класса необходимо перед новой переменной указать self. Создание методов класса При создании метода ему автоматически передаётся аргумент с содержанием self, который является ссылкой на экземпляр класса. Поэтому первым аргументом нужно прописывать self, для того чтобы значение передавалось в этот аргумент. *Значение ссылки на объект класса* При применении методов класса к атрибутам класса в объекте, будут изменены атрибуты класса (изменение для всех объектов) Для инициализации полей (без использования __init__) можно использовать lazy loading - инициализация полей из метода. (Например, через self.__dict__ или setattr()) __INIT__ и __DEL__ Метод класса __init__ вызывается при инициализации объекта. С его помощью можно задать поля, которые будут использоваться в объекте. Чтобы передать в метод значения для аргументов их нужно прописывать при создании объекта в круглых скобках после названия класса. Метод класса __del__ вызывается при удалении объекта (когда сборщик мусора языка python удаляет объект из адресного пространства). Удаляется объект тогда, когда на объект в адресном пространстве не ссылается никакая переменная. Например при переназначении переменной. Метод вызывается когда объект существует, но после удаления объекта этот метод пропадает вместе с ним. Если нужно присвоить переменную, которая не будет изменяться внутри объекта извне, то нужно копировать переменную (Например, использовать метод copy() или self.data = data[:] в случае со списком) Магический метод __new__. Пример паттерна Singleton. Метод класса __new__ вызывается перед созданием объекта класса. При инициализации метода вместо self пишется cls. self - ссылка на объект. cls - ссылка на класс. Метод __new__ обязательно должен возвращать ссылку на созданный объект. Для этого следует прописать в возвращаемом значении: super().__new__(cls) Все классы автоматически наследуются от класса object. При вызове функции super() возвращается ссылка на базовый класс. При вызове метода __new__(cls), запускается процесс создания экземпляра класса. Идет обращение к базовому классу, из которого вызывается конструктор - метод __new__(cls) с аргументом cls - ссылки на текущий класс, для которого создается экземпляр класса *args, **kwargs - прописываются в обязательном порядке, так как без них нельзя будет передать аргументы экземпляру класса. Singleton - паттерн проектирования, при котором у класса может быть лишь один экземпляр. Пример реализация паттерна Singleton с удалением переопределением полей класса: Интересное решение задачи: super().__new__(для создания объекта класса указанного в скобках)