fork download
  1. #!/usr/bin/env python3
  2.  
  3. from abc import ABCMeta, abstractmethod
  4.  
  5. class Shape_(metaclass=ABCMeta):
  6. @abstractmethod
  7. def calc_(self):
  8. pass
  9.  
  10. class Shape(metaclass=ABCMeta):
  11. @abstractmethod
  12. def calc(self):
  13. pass
  14.  
  15. class Rect(Shape):
  16. def __init__(self, w, h):
  17. self.w = w
  18. self.h = h
  19.  
  20. def calc(self):
  21. area = self.w * self.h
  22. print('area rect:', area)
  23.  
  24. class Circle(Shape):
  25. def __init__(self, r):
  26. self.r = r
  27.  
  28. def calc(self):
  29. area = self.r * self.r * 3.14
  30. print('area circle: ', area)
  31.  
  32.  
  33. class AreaCalc:
  34. def calc(self, shape):
  35. # if isinstance(shape, Shape_): # wrong
  36. if isinstance(shape, Shape): # right
  37. shape.calc()
  38. else:
  39. raise Exception('wrong interface')
  40.  
  41.  
  42. circle = Circle(2)
  43. rect = Rect(4, 2)
  44. areaCalc = AreaCalc()
  45. areaCalc.calc(rect)
  46. areaCalc.calc(circle)
Success #stdin #stdout 0.02s 27656KB
stdin
Standard input is empty
stdout
area rect: 8
area circle:  12.56