fork download
  1. import abc
  2.  
  3. class ConprehensiveABCMeta(abc.ABCMeta):
  4. _NOTFOUND = object()
  5.  
  6. def __new__(metacls, name, bases, namespace, /, **kwargs):
  7. cls = super().__new__(metacls, name, bases, namespace, **kwargs)
  8. abstracts = set(cls.__abstractmethods__)
  9. for name in cls.__abstractmethods__:
  10. for base in bases:
  11. value = getattr(base, name, cls._NOTFOUND)
  12. if not (value is cls._NOTFOUND or
  13. getattr(value, '__isabstractmethod__', False)):
  14. setattr(cls, name, value)
  15. abstracts.remove(name)
  16. break
  17. cls.__abstractmethods__ = frozenset(abstracts)
  18. return cls
  19.  
  20. class ConprehensiveABC(metaclass=ConprehensiveABCMeta):
  21. pass
  22.  
  23. class A(ConprehensiveABC):
  24. @abc.abstractmethod
  25. def x(self):
  26. pass
  27.  
  28. def y(self):
  29. return "A.y"
  30.  
  31.  
  32. class B(ConprehensiveABC):
  33. @abc.abstractmethod
  34. def y(self):
  35. pass
  36.  
  37. def x(self):
  38. return "B.x"
  39.  
  40. class AB(B, A):
  41. pass
  42.  
  43.  
  44. ab = AB()
  45. print(ab.x())
  46. print(ab.y())
Success #stdin #stdout 0.03s 9608KB
stdin
Standard input is empty
stdout
B.x
A.y