Емуляція числових типів

Оновлено: 28.04.2023

Наступні методи можна визначити для емуляції числових об’єктів. Методи, що відповідають операціям, які не підтримуються конкретним видом реалізованого числа (наприклад, побітові операції для нецілісних чисел), слід залишити невизначеними.

object.__add__(self, other) object.__sub__(self, other) object.__mul__(self, other) object.__matmul__(self, other) object.__truediv__(self, other) object.__floordiv__(self, other) object.__mod__(self, other) object.__divmod__(self, other) object.__pow__(self, other[, modulo]) object.__lshift__(self, other) object.__rshift__(self, other) object.__and__(self, other) object.__xor__(self, other) object.__or__(self, other) These methods are called to implement the binary arithmetic operations (+, -, *, @, /, //, %, divmod(), pow(), **, <<, >>, &, ^, |). For instance, to evaluate the expression x + y, where x is an instance of a class that has an __add__() method, type(x).__add__(x, y) is called. The __divmod__() method should be the equivalent to using __floordiv__() and __mod__(); it should not be related to __truediv__(). Note that __pow__() should be defined to accept an optional third argument if the ternary version of the built-in pow() function is to be supported. Якщо один із цих методів не підтримує операцію з наданими аргументами, він має повернути NotImplemented.

object.__radd__(self, other) object.__rsub__(self, other) object.__rmul__(self, other) object.__rmatmul__(self, other) object.__rtruediv__(self, other) object.__rfloordiv__(self, other) object.__rmod__(self, other) object.__rdivmod__(self, other) object.__rpow__(self, other[, modulo]) object.__rlshift__(self, other) object.__rrshift__(self, other) object.__rand__(self, other) object.__rxor__(self, other) object.__ror__(self, other) These methods are called to implement the binary arithmetic operations (+, -, *, @, /, //, %, divmod(), pow(), **, <<, >>, &, ^, |) with reflected (swapped) operands. These functions are only called if the left operand does not support the corresponding operation 3 and the operands are of different types. 4 For instance, to evaluate the expression x - y, where y is an instance of a class that has an __rsub__() method, type(y).__rsub__(y, x) is called if type(x).__sub__(x, y) returns NotImplemented. Зауважте, що тернарний pow() не намагатиметься викликати __rpow__() (правила примусу стануть надто складними). Примітка Якщо тип правого операнда є підкласом типу лівого операнда і цей підклас забезпечує іншу реалізацію відображеного методу для операції, цей метод буде викликаний перед невідображеним методом лівого операнда. Така поведінка дозволяє підкласам перевизначати операції своїх предків.

object.__iadd__(self, other) object.__isub__(self, other) object.__imul__(self, other) object.__imatmul__(self, other) object.__itruediv__(self, other) object.__ifloordiv__(self, other) object.__imod__(self, other) object.__ipow__(self, other[, modulo]) object.__ilshift__(self, other) object.__irshift__(self, other) object.__iand__(self, other) object.__ixor__(self, other) object.__ior__(self, other) Ці методи викликаються для реалізації розширених арифметичних присвоювань (+=, -=, *=, @=, /=, // =, %=, **=, <<=, >>=, &=, ^=, |=). Ці методи мають спробувати виконати операцію на місці (змінюючи self) і повернути результат (який може бути, але не обов’язково, self). Якщо конкретний метод не визначено, доповнене призначення повертається до звичайних методів. Наприклад, якщо x є екземпляром класу з методом __iadd__(), x += y еквівалентно x = x.__iadd__(y). В іншому випадку x.__add__(y) і y.__radd__(x) розглядаються, як і з оцінкою x + y. У певних ситуаціях доповнене призначення може призвести до неочікуваних помилок (див. Чому a_tuple[i] += [„item“] викликає виключення, коли додавання працює?), але така поведінка насправді є частиною моделі даних.

object.__neg__(self) object.__pos__(self) object.__abs__(self) object.__invert__(self) Викликається для реалізації унарних арифметичних операцій (-, +, abs() і ~).

object.__complex__(self) object.__int__(self) object.__float__(self) Викликається для реалізації вбудованих функцій complex(), int() і float(). Має повертати значення відповідного типу.

object.__index__(self) Викликається для реалізації operator.index() і кожного разу, коли Python потребує без втрат перетворити числовий об’єкт у цілочисельний об’єкт (наприклад, у зрізі або у вбудованих bin(), hex() і oct()). Наявність цього методу вказує на те, що числовий об’єкт є цілим типом. Має повертати ціле число. Якщо __int__(), __float__() і __complex__() не визначено, то відповідні вбудовані функції int(), float() і complex() повернутися до __index__().

object.__round__(self[, ndigits]) object.__trunc__(self) object.__floor__(self) object.__ceil__(self) Викликається для реалізації вбудованої функції round() і math функції trunc(), floor() і ceil(). Якщо ndigits не передано в __round__(), усі ці методи повинні повертати значення об’єкта, усічене до Integral (зазвичай int). Вбудована функція int() повертається до __trunc__(), якщо не визначено ні __int__(), ні __index__(). Змінено в версії 3.11: The delegation of int() to __trunc__() is deprecated.