#!/usr/bin/env python3
from abc import ABCMeta, abstractmethod
class Shape_(metaclass=ABCMeta):
@abstractmethod
def calc_(self):
pass
class Shape(metaclass=ABCMeta):
@abstractmethod
def calc(self):
pass
class Rect(Shape):
def __init__(self, w, h):
self.w = w
self.h = h
def calc(self):
area = self.w * self.h
print('area rect:', area)
class Circle(Shape):
def __init__(self, r):
self.r = r
def calc(self):
area = self.r * self.r * 3.14
print('area circle: ', area)
class AreaCalc:
def calc(self, shape):
# if isinstance(shape, Shape_): # wrong
if isinstance(shape, Shape): # right
shape.calc()
else:
raise Exception('wrong interface')
circle = Circle(2)
rect = Rect(4, 2)
areaCalc = AreaCalc()
areaCalc.calc(rect)
areaCalc.calc(circle)
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwogCmZyb20gYWJjIGltcG9ydCBBQkNNZXRhLCBhYnN0cmFjdG1ldGhvZAoKY2xhc3MgU2hhcGVfKG1ldGFjbGFzcz1BQkNNZXRhKToKICAgIEBhYnN0cmFjdG1ldGhvZAogICAgZGVmIGNhbGNfKHNlbGYpOgogICAgICAgIHBhc3MKCmNsYXNzIFNoYXBlKG1ldGFjbGFzcz1BQkNNZXRhKToKICAgIEBhYnN0cmFjdG1ldGhvZAogICAgZGVmIGNhbGMoc2VsZik6CiAgICAgICAgcGFzcwoKY2xhc3MgUmVjdChTaGFwZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgdywgaCk6CiAgICAgICAgc2VsZi53ID0gdwogICAgICAgIHNlbGYuaCA9IGgKCiAgICBkZWYgY2FsYyhzZWxmKToKICAgICAgICBhcmVhID0gc2VsZi53ICogc2VsZi5oCiAgICAgICAgcHJpbnQoJ2FyZWEgcmVjdDonLCBhcmVhKSAgICAgICAgCgpjbGFzcyBDaXJjbGUoU2hhcGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHIpOgogICAgICAgIHNlbGYuciA9IHIKCiAgICBkZWYgY2FsYyhzZWxmKToKICAgICAgICBhcmVhID0gc2VsZi5yICogc2VsZi5yICogMy4xNAogICAgICAgIHByaW50KCdhcmVhIGNpcmNsZTogJywgYXJlYSkKCiAgICAgIApjbGFzcyBBcmVhQ2FsYzoKICAgIGRlZiBjYWxjKHNlbGYsIHNoYXBlKToKICAgICAgICAjIGlmIGlzaW5zdGFuY2Uoc2hhcGUsIFNoYXBlXyk6ICAgICAjIHdyb25nCiAgICAgICAgaWYgaXNpbnN0YW5jZShzaGFwZSwgU2hhcGUpOiAgICAgICAgIyByaWdodAogICAgICAgICAgICBzaGFwZS5jYWxjKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ3dyb25nIGludGVyZmFjZScpIAoKCmNpcmNsZSA9IENpcmNsZSgyKQpyZWN0ID0gUmVjdCg0LCAyKQphcmVhQ2FsYyA9IEFyZWFDYWxjKCkKYXJlYUNhbGMuY2FsYyhyZWN0KQphcmVhQ2FsYy5jYWxjKGNpcmNsZSk=