蟒蛇的typing
模块定义了许多鸭子类型,例如,typing.SupportsAbs
表示任何实现了__abs__
特殊方法。
是否可以以某种方式定义自定义鸭子类型,以便我可以将它们用作有效的类型注释?
例如,我希望能够注释一个参数应该是一个鸭子类型的等价物threading.Lock
,即任何实现acquire
and release
方法。理想情况下,我可以将这样的论点注释为SupportsAcquireAndRequire
or DuckLock
, 而不是object
.
您可以定义一个抽象基类 (ABC) https://docs.python.org/3/library/abc.html指定接口:
from abc import ABCMeta, abstractmethod
class SupportsAcquireAndRequire(metaclass=ABCMeta):
@abstractmethod
def acquire(self):
pass
@abstractmethod
def release(self):
pass
@classmethod
def __subclasshook__(cls, C):
for method in ('release', 'acquire'):
for B in C.__mro__:
if method in B.__dict__:
if B.__dict__[method] is None:
return NotImplemented
break
else:
return NotImplemented
return True
这基本上就是协议的方式(比如typing.SupportsAbs
)已实现,尽管没有直接使用ABCMeta
.
通过给 ABC__subclasshook__ method https://docs.python.org/3/library/abc.html#abc.ABCMeta.__subclasshook__,你可以使用它isinstance()
and issubclass()
测试,这对于像这样的工具来说已经足够好了mypy http://mypy.readthedocs.io/en/latest/class_basics.html?highlight=abc#abstract-base-classes-and-multiple-inheritance:
>>> from threading import Lock
>>> isinstance(Lock(), SupportsAcquireAndRequire)
True
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)