最近,我正在研究一些Python习语。
我发现了Python中使用的协议的许多描述,例如排序(__cmp__
,...)或生成器。此外,还有像__hash__
这样的方法,它们是为每个对象定义的(我想)。
在互联网上进行一些搜索之后,我还没有找到这些协议和方法的完整列表。
任何人都可以给我一些指针 URL吗?
答案 0 :(得分:16)
您的最佳参考始终是Python Online Documentation,特别是Special method names上的部分。
交互式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)
答案 1 :(得分:1)
按照约定,协议是描述特殊行为的特殊方法组。您可以从collections.abc
模块的抽象方法(Python 3.3+)中推断出协议;另请参见docs。使用以下命令自动执行此列表:
给予
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__']
}
注意:当进行子分类时,这些是(必需的)抽象方法,不包括mixin方法。示例:实现协议后,子类collections.abc.Mappings
将提供方法.keys()
,.values()
,.items()
(未列出)。