Форум сайта python.su
0
этот пост заставил меня поразмышлять над полезностью интерфейсов в python. Далее я изложу свои мысли, а вы пожалуйста поправьте меня и укажите на что ещё обратить внимание для полного уяснения темы.
в следующем коде я использую интерфейсы для фигур Rect и Circle. В результате я могу в методе calc класса AreaCalc при помощи условного оператора проверить имеет ли проверяемая форма нужный метод.
#!/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)
class AreaCalc() {
calc(shape: Shape) {
shape.calc()
}
}Отредактировано zlodiak (Март 16, 2019 12:41:05)
Офлайн
568
zlodiak
Многие паттерны вообще придуманы для обхода ограничений статической типизации. И в случае с питоном есть не просто возможность реализовать паттерн по-другому, его вообще не надо применять, код пишется принципиально иначе.
Офлайн