abc 模块 抽象相关
abc.ABCMeta 抽象元类
__subclasshook__ 虚拟子类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| import abc class AbstractDuck(metaclass = abc.ABCMeta): @classmethod def __subclasshook__(cls, other): quack = getattr(other, 'quack', None) return callable(quack)
class Duck(object): def quack(self): pass
class NotDuck(object): quack = 'foo' >>> issu bclass(Duck, AbstractDuck) True >>> issubclass(NotDuck, AbstractDuck) False
>>> AbstractDuck.register(NotDuck) <class '__main__.NotDuck'> >>> issubclass(NotDuck, AbstractDuck) False
import abc class AbstractDuck(metaclass = abc.ABCMeta): @classmethod def __subclasshook__(cls, other): quack = getattr(other, 'quack', None) if callable(quack): return True return NotImplemented >>> issubclass(NotDuck, AbstractDuck) False >>> AbstractDuck.register(NotDuck) <class '__main__.NotDuck'> >>> issubclass(NotDuck, AbstractDuck) True
|