Полный список протоколов/интерфейсов Python

В последнее время я просматривал некоторые идиомы Python. Я нашел много описаний протоколов, используемых в Python, таких как порядок (__cmp__, ...) или генераторы. Кроме того, есть также такие методы, как __hash__, которые определены для каждого объекта (я полагаю).

После некоторого поиска в Интернете я не нашел исчерпывающего списка этих протоколов и методов. Может ли кто-нибудь дать мне несколько URL-адресов pointers?


person Kru    schedule 22.05.2011    source источник
comment
xkcd.com/138 [Извините]   -  person Johnsyweb    schedule 22.05.2011
comment
К вашему сведению, их часто называют магическими методами.   -  person Katriel    schedule 22.05.2011
comment
возможный дубликат специальных (магических) методов в Python   -  person Katriel    schedule 22.05.2011


Ответы (2)


Лучшей справочной информацией всегда будет онлайн-документация по Python, особенно раздел Имена специальных методов.

Интерактивный интерпретатор Python также является очень полезным инструментом. Попробуйте некоторые из них:

>>> dir(object)
['__class__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
>>> help(object.__class__)

>>> help(object.__hash__)

>>> help(hash)
person Johnsyweb    schedule 22.05.2011

По соглашению протоколы представляют собой группы специальных методов, описывающих общее поведение. Вы можете вывести протоколы из абстрактных методов модуля collections.abc. (Питон 3.3+); см. также документы . Автоматизируйте этот список с помощью следующего:

Дано

import abc

import collections as ct

Код

def get_protocols(source=ct.abc):
    """Return a dict of protocols from `collections.abc`."""
    d = {}

    for objname in dir(source):

        if objname.startswith("_"):
            continue
        obj = getattr(source, objname)
        abmethods = sorted(obj.__abstractmethods__)
        if not abmethods:
            continue    
        d[objname] = abmethods        
    return d

Демо

get_protocols()

Выход

{
 'AsyncGenerator': ['asend', 'athrow'], 
 'AsyncIterable': ['__aiter__'], 
 'AsyncIterator': ['__anext__'],
 'Awaitable': ['__await__'], 
 'ByteString': ['__getitem__', '__len__'],
 'Callable': ['__call__'], 
 'Collection': ['__contains__', '__iter__', '__len__'], 
 'Container': ['__contains__'], 
 'Coroutine': ['__await__', 'send', 'throw'], 
 'Generator': ['send', 'throw'], 
 'Hashable': ['__hash__'], 
 'Iterable': ['__iter__'], 
 'Iterator': ['__next__'],
 'Mapping': ['__getitem__', '__iter__', '__len__'], 
 'MutableMapping': ['__delitem__', '__getitem__', '__iter__', '__len__', '__setitem__'],
 'MutableSequence': ['__delitem__', '__getitem__', '__len__', '__setitem__', 'insert'], 
 'MutableSet': ['__contains__', '__iter__', '__len__', 'add', 'discard'],
 'Reversible': ['__iter__', '__reversed__'], 
 'Sequence': ['__getitem__', '__len__'], 
 'Set': ['__contains__', '__iter__', '__len__'], 
 'Sized': ['__len__']
}

ПРИМЕЧАНИЕ. При создании подклассов это (обязательные) абстрактные методы, которые не включают методы примесей. Пример: подкласс collections.abc.Mappings предоставит методы .keys(), .values(), .items() (нет в списке) после реализации протокола.

person pylang    schedule 22.02.2020