Базове налаштування
Оновлено: 28.04.2023
object.__new__(cls[, ...]) Викликається для створення нового екземпляра класу cls. __new__() — це статичний метод (з особливим регістром, тому вам не потрібно оголошувати його як такий), який приймає клас, екземпляр якого був запитаний, як свій перший аргумент. Решта аргументів передаються у вираз конструктора об’єкта (виклик класу). Поверненим значенням __new__() має бути новий екземпляр об’єкта (зазвичай це екземпляр cls). Typical implementations create a new instance of the class by invoking the superclass’s __new__() method using super().__new__(cls[, ...]) with appropriate arguments and then modifying the newly created instance as necessary before returning it. Якщо __new__() викликається під час побудови об’єкта і повертає екземпляр cls, тоді новий метод __init__() буде викликано як __init__(self[, ...]), де self — це новий екземпляр, а решта аргументів ті самі, що були передані конструктору об’єкта. Якщо __new__() не повертає екземпляр cls, то метод __init__() нового екземпляра не буде викликано. __new__() призначений головним чином для того, щоб дозволити підкласам незмінних типів (наприклад, int, str або tuple) налаштовувати створення екземплярів. Його також зазвичай перевизначають у власних метакласах, щоб налаштувати створення класу.
object.__init__(self[, ...]) Викликається після створення екземпляра (за допомогою __new__()), але до того, як його буде повернено до викликаючого. Аргументи передаються у вираз конструктора класу. Якщо базовий клас має метод __init__(), метод __init__() похідного класу, якщо такий є, повинен явно викликати його, щоб забезпечити правильну ініціалізацію частини базового класу примірника; наприклад: super().__init__([args...]). Оскільки __new__() і __init__() працюють разом у створенні об’єктів (__new__(), щоб створити його, і __init__(), щоб налаштувати його), немає не-None значення може повертати __init__(); це призведе до появи TypeError під час виконання.
object.__del__(self) Викликається, коли примірник збирається знищити. Це також називається фіналізатором або (неправильно) деструктором. Якщо базовий клас має метод __del__(), метод __del__() похідного класу, якщо такий є, повинен явно викликати його, щоб забезпечити належне видалення частини базового класу екземпляра. Метод __del__() може (хоча і не рекомендується!) відкласти знищення екземпляра шляхом створення нового посилання на нього. Це називається воскресіння об’єкта. Це залежить від реалізації, чи __del__() викликається вдруге, коли воскреслий об’єкт збирається знищити; поточна реалізація CPython викликає його лише один раз. Не гарантується, що методи __del__() викликаються для об’єктів, які все ще існують, коли інтерпретатор завершує роботу. Примітка del x не викликає напряму x.__del__() — перший зменшує кількість посилань для x на одиницю, а останній викликається лише тоді, коли x кількість посилань досягає нуля. Деталі реалізації CPython: It is possible for a reference cycle to prevent the reference count of an object from going to zero. In this case, the cycle will be later detected and deleted by the cyclic garbage collector. A common cause of reference cycles is when an exception has been caught in a local variable. The frame’s locals then reference the exception, which references its own traceback, which references the locals of all frames caught in the traceback. Дивись також Документація для модуля gc. Попередження Через ненадійні обставини, за яких викликаються методи __del__(), винятки, що виникають під час їх виконання, ігноруються, а попередження друкується в sys.stderr. Зокрема: __del__() можна викликати, коли виконується довільний код, у тому числі з будь-якого довільного потоку. Якщо __del__() потрібно заблокувати або викликати будь-який інший блокуючий ресурс, це може призвести до блокування, оскільки ресурс може вже бути зайнятий кодом, який переривається для виконання __del__(). __del__() можна виконати під час завершення роботи інтерпретатора. Як наслідок, глобальні змінні, до яких він має отримати доступ (включно з іншими модулями), можливо, уже були видалені або встановлені на None. Python гарантує, що глобальні елементи, ім’я яких починається з одного підкреслення, будуть видалені з їхнього модуля перед видаленням інших глобальних елементів; якщо немає інших посилань на такі глобали, це може допомогти впевнитися, що імпортовані модулі все ще доступні під час виклику методу __del__().
object.__repr__(self) Викликається вбудованою функцією repr() для обчислення «офіційного» рядкового представлення об’єкта. Якщо це взагалі можливо, це має виглядати як дійсний вираз Python, який можна використати для відтворення об’єкта з тим самим значенням (за умови відповідного середовища). Якщо це неможливо, слід повернути рядок у формі <...some useful description...>. Повернене значення має бути рядковим об’єктом. Якщо клас визначає __repr__(), але не __str__(), тоді __repr__() також використовується, коли потрібне «неформальне» рядкове представлення екземплярів цього класу. Це зазвичай використовується для налагодження, тому важливо, щоб представлення було насиченим інформацією та однозначним.
object.__str__(self) Викликається str(object) і вбудованими функціями format() і print() для обчислення «неформального» або зручного для друку рядкового представлення об’єкта. Повернене значення має бути об’єктом string. Цей метод відрізняється від object.__repr__() тим, що не очікується, що __str__() поверне дійсний вираз Python: можна використовувати більш зручне або стисле представлення. Стандартна реалізація, визначена вбудованим типом object, викликає object.__repr__().
object.__bytes__(self) Викликається bytes для обчислення байтового представлення об’єкта. Це має повернути об’єкт bytes.
object.__format__(self, format_spec) Викликається вбудованою функцією format() і за допомогою розширення обчислення форматованих рядкових літералів і методу str.format(), щоб створити «відформатований» рядковий представлення об’єкт. Аргумент format_spec — це рядок, який містить опис бажаних параметрів форматування. Інтерпретація аргументу format_spec залежить від типу, що реалізує __format__(), проте більшість класів або делегують форматування одному з вбудованих типів, або використовують подібний синтаксис параметрів форматування. Перегляньте Міні-мова специфікації формату для опису стандартного синтаксису форматування. Повернене значення має бути рядковим об’єктом. Змінено в версії 3.4: Сам метод __format__ object викликає TypeError, якщо передати будь-який непорожній рядок. Змінено в версії 3.7: object.__format__(x, '') тепер еквівалентний str(x), а не format(str(x), '').
object.__lt__(self, other) object.__le__(self, other) object.__eq__(self, other) object.__ne__(self, other) object.__gt__(self, other) object.__ge__(self, other) Це так звані методи «багатого порівняння». Відповідність між символами оператора та назвами методів така: x y викликає x.__gt__(y), а x>=y викликає x.__ge__(y). Розширений метод порівняння може повертати синглтон NotImplemented, якщо він не реалізує операцію для заданої пари аргументів. Згідно з домовленістю, для успішного порівняння повертаються False і True. Однак ці методи можуть повертати будь-яке значення, тому, якщо оператор порівняння використовується в логічному контексті (наприклад, в умові оператора if), Python викличе bool() для значення, щоб визначити якщо результат істинний або хибний. За замовчуванням object реалізує __eq__() за допомогою is, повертаючи NotImplemented у випадку хибного порівняння: True if x is y else NotImplemented. Для __ne__() за замовчуванням він делегує __eq__() та інвертує результат, якщо він не NotImplemented. Серед операторів порівняння чи реалізацій за замовчуванням немає інших припущених зв’язків; наприклад, істинність (x
object.__hash__(self) Викликається вбудованою функцією hash() і для операцій над членами хешованих колекцій, включаючи set, frozenset і dict. Метод __hash__() має повертати ціле число. Єдиною необхідною властивістю є те, що об’єкти, які порівнюються, мають однакове хеш-значення; рекомендується змішувати геш-значення компонентів об’єкта, які також відіграють роль у порівнянні об’єктів, упаковуючи їх у кортеж і хешуючи кортеж. Приклад: def __hash__(self): return hash((self.name, self.nick, self.color)) Примітка hash() скорочує значення, що повертається користувацьким методом __hash__() об’єкта, до розміру Py_ssize_t. Зазвичай це 8 байтів для 64-розрядних збірок і 4 байти для 32-розрядних збірок. Якщо __hash__() об’єкта має взаємодіяти зі збірками різних бітових розмірів, обов’язково перевірте ширину всіх підтримуваних збірок. Простий спосіб зробити це за допомогою python -c "import sys; print(sys.hash_info.width)". If a class does not define an __eq__() method it should not define a __hash__() operation either; if it defines __eq__() but not __hash__(), its instances will not be usable as items in hashable collections. If a class defines mutable objects and implements an __eq__() method, it should not implement __hash__(), since the implementation of hashable collections requires that a key’s hash value is immutable (if the object’s hash value changes, it will be in the wrong hash bucket). Визначені користувачем класи за замовчуванням мають методи __eq__() і __hash__(); з ними всі об’єкти порівнюються нерівно (крім самих себе), і x.__hash__() повертає відповідне значення, так що x == y означає, що x є y і hash (x) == хеш(y). Для класу, який перевизначає __eq__() і не визначає __hash__(), його __hash__() буде неявно встановлено на None. Коли метод __hash__() класу має значення None, екземпляри класу викличуть відповідну TypeError, коли програма намагатиметься отримати їх хеш-значення, а також будуть правильно визначені як нехешується під час перевірки isinstance(obj, collections.abc.Hashable). Якщо клас, який перевизначає __eq__(), потребує збереження реалізації __hash__() від батьківського класу, інтерпретатор має бути повідомлений про це явно, встановивши __hash__ = .__hash__. Якщо клас, який не перевизначає __eq__(), бажає придушити підтримку хешу, він повинен включити __hash__ = None у визначення класу. Клас, який визначає власний __hash__(), який явно викликає TypeError, буде неправильно ідентифікований як хешований викликом isinstance(obj, collections.abc.Hashable). Примітка За замовчуванням значення __hash__() об’єктів str і bytes «підсолюються» непередбачуваним випадковим значенням. Хоча вони залишаються незмінними в окремому процесі Python, вони не передбачувані між повторними викликами Python. This is intended to provide protection against a denial-of-service caused by carefully chosen inputs that exploit the worst case performance of a dict insertion, O(n2) complexity. See http://www.ocert.org/advisories/ocert-2011-003.html for details. Зміна хеш-значень впливає на порядок ітерацій наборів. Python ніколи не надавав гарантій щодо такого порядку (і він зазвичай варіюється між 32-бітними та 64-бітними збірками). Дивіться також PYTHONHASHSEED. Змінено в версії 3.3: Хеш-рандомізація ввімкнена за замовчуванням.
def __hash__(self):
return hash((self.name, self.nick, self.color))
object.__bool__(self) Викликається для реалізації перевірки значення істинності та вбудованої операції bool(); має повертати False або True. Коли цей метод не визначено, викликається __len__(), якщо він визначений, і об’єкт вважається істинним, якщо його результат ненульовий. Якщо клас не визначає ані __len__(), ані __bool__(), усі його екземпляри вважаються істинними.