Используют ли Python 2 и 3 один и тот же набор магических методов?

#python #python-3.x #python-2.x #magic-methods

#python #magic-методы

Вопрос:

Используют ли Python 2 и 3 одни и те же магические методы (с одинаковыми именами)?

Если нет, кто-нибудь знает удобный полный список всех магических методов в Python 3?

Комментарии:

1. Почему? Они либо нужны вам, и вы исследуете, что вам нужно, либо они вам не нужны, и вы прекрасно обходитесь без них. python magic methods google -> 31,2 миллиона результатов. Почему они вам не помогают?

2. Может быть, вы могли бы сравнить это и это .

3. С моей точки зрения, __matmul__ был введен в Python 3 и __nonzero__ был удален из Python 3 (заменен на __bool__ ?).

Ответ №1:

Магические методы являются синонимами того, что Python более формально называет специальными методами. Специальные методы в Python 3 описаны в разделе 3.3. Специальные имена методов — документация Python 3, а те, что в Python 2, описаны в разделе 3.4. Специальные имена методов — документация Python 2.

Быстрый поиск (через grep -oh "__w*__" | sort | uniq ) выдает следующие специальные имена (1) для Python 3:

 __abs__
__add__
__aenter__
__aexit__
__aiter__
__and__
__anext__
__annotations__
__await__
__bases__
__bool__
__bytes__
__call__
__ceil__
__class__
__classcell__
__class_getitem__
__closure__
__code__
__complex__
__contains__
__defaults__
__del__
__delattr__
__delete__
__delitem__
__dict__
__dir__
__divmod__
__doc__
__enter__
__eq__
__exit__
__file__
__float__
__floor__
__floordiv__
__format__
__func__
__future__
__ge__
__get__
__getattr__
__getattribute__
__getitem__
__globals__
__gt__
__hash__
__iadd__
__iand__
__ifloordiv__
__ilshift__
__imatmul__
__imod__
__import__ (2)
__imul__
__index__
__init__
__init_subclass__
__instancecheck__
__int__
__invert__
__ior__
__ipow__
__irshift__
__isub__
__iter__
__itruediv__
__ixor__
__kwdefaults__
__le__
__len__
__length_hint__
__lshift__
__lt__
__match_args__
__matmul__
__missing__
__mod__
__module__
__mro__
__mro_entries__
__mul__
__name__
__ne__
__neg__
__new__
__next__
__objclass__
__or__
__pos__
__pow__
__prepare__
__qualname__
__radd__
__rand__
__rdivmod__
__repr__
__reversed__
__rfloordiv__
__rlshift__
__rmatmul__
__rmod__
__rmul__
__ror__
__round__
__rpow__
__rrshift__
__rshift__
__rsub__
__rtruediv__
__rxor__
__self__
__set__
__setattr__
__setitem__
__set_name__
__slots__
__str__
__sub__
__subclasscheck__
__traceback__
__truediv__
__trunc__
__weakref__
__xor__
 

и эти специальные имена для Python 2:

 __abs__
__add__
__and__
__bases__
__call__
__class__
__closure__
__cmp__
__code__
__coerce__
__complex__
__contains__
__defaults__
__del__
__delattr__
__delete__
__delitem__
__delslice__
__dict__
__div__
__divmod__
__doc__
__enter__
__eq__
__exit__
__file__
__float__
__floordiv__
__func__
__future__
__ge__
__get__
__getattr__
__getattribute__
__getitem__
__getslice__
__globals__
__gt__
__hash__
__hex__
__iadd__
__iand__
__idiv__
__ifloordiv__
__ilshift__
__imod__
__imul__
__index__
__init__
__instancecheck__
__int__
__invert__
__iop__
__ior__
__ipow__
__irshift__
__isub__
__iter__
__itruediv__
__ixor__
__le__
__len__
__long__
__lshift__
__lt__
__metaclass__
__missing__
__mod__
__module__
__mro__
__mul__
__name__
__ne__
__neg__
__new__
__nonzero__
__oct__
__op__
__or__
__pos__
__pow__
__radd__
__rand__
__rcmp__
__rdiv__
__rdivmod__
__repr__
__reversed__
__rfloordiv__
__rlshift__
__rmod__
__rmul__
__rop__
__ror__
__rpow__
__rrshift__
__rshift__
__rsub__
__rtruediv__
__rxor__
__self__
__set__
__setattr__
__setitem__
__setslice__
__slots__
__str__
__sub__
__subclasscheck__
__truediv__
__unicode__
__weakref__
__xor__
 

Сравнивая эти списки, мы получаем следующие имена, которые упоминаются в модели данных Python 3 (начиная с Python 3.10), но не в модели данных Python 2:

 __aenter__
__aexit__
__aiter__
__anext__
__annotations__
__await__
__bool__
__bytes__
__ceil__
__classcell__
__class_getitem__
__dir__
__floor__
__format__
__imatmul__
__import__ (2)
__init_subclass__
__kwdefaults__
__length_hint__
__match_args_
__matmul__
__mro_entries__
__next__
__objclass__
__prepare__
__qualname__
__rmatmul__
__round__
__set_name__
__traceback__
__trunc__
 

и эти имена, которые упоминаются в модели данных Python 2, но не в модели данных Python 3:

 __cmp__
__coerce__
__delslice__
__div__
__getslice__
__hex__
__idiv__
__iop__
__long__
__metaclass__
__nonzero__
__oct__
__op__
__rcmp__
__rdiv__
__rop__
__setslice__
__unicode__
 

Обратите внимание, что только потому, что имя упоминается как в моделях данных Python 2, так и в Python 3, не обязательно означает, что оно имеет особое значение в обеих версиях или что его значение не изменилось. Для использования этой информации любым значимым способом (статический анализ, синтаксический анализ и т. Д.) Потребуется более подробное чтение документации.


(1) Эти списки не следует считать исчерпывающими списками всех специальных идентификаторов в Python, которые следуют схеме зарезервированных __<name>__ имен. Это просто списки идентификаторов __<name>__ формы, которые случайно появляются где-то в документации по модели данных Python. Это означает, что они должны включать все специальные методы и специальные атрибуты, определенные в Python, но они не будут включать специальные идентификаторы, которые появляются в других контекстах. Например, специальное имя __debug__ не включено, поскольку оно нигде не упоминается в документации по модели данных.

(2) Имя __import__ не является специальным методом или специальным атрибутом в модели данных Python, а скорее просто встроенным с уникальным именем. Он также присутствует как в Python 2, так и в Python 3, несмотря на то, что могут предложить приведенные выше списки. Эта ошибка оставлена нетронутой, чтобы подчеркнуть тот факт, что списки тезисов представляют собой просто списки всех идентификаторов формы __<name>__ , найденных в документации по модели данных Python, и они (пока) не были тщательно изучены, чтобы убедиться, что они включают только специальные методы и специальные атрибуты.

Комментарии:

1. Обратите внимание, что, поскольку вы создали только grep, некоторые имена могут не соответствовать магическим методам, но быть другими именами с тем же шаблоном. Из списков я знаю, что это так __import__ (и, возможно, это единственный случай — остальные должны быть либо методами, либо атрибутами)