Shape Triangle Rectangle Circle类的实现

  

import math


class Shape:
    @property
    def area(self):
        raise NotImplementedError('Base class not implemented')


class Triangle(Shape):
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    @property
    def area(self):
        p = self.a + self.b + self.c
        return math.sqrt(p * (p - self.a) * (p - self.b) * (p - self.c))


class Rectangle(Shape):
    def __init__(self, height, width):
        self.h = height
        self.w = width

    @property
    def area(self):
        return self.h * self.w


class Circle(Shape):
    def __init__(self, radius):
        self.d = radius * 2

    @property
    def area(self):
        return math.pi * self.d * self.d * 0.25


shapes = [Triangle(3, 4, 5), Rectangle(3, 4), Circle(4)]
for b in shapes:
    print('the area of {} = {}'.format(b.__class__.__name__, b.area))

# implement serialization
# 1 Mixin
import json, pickle, msgpack


class SerializableMixin:
    def dumps(self, type='json'):
        if type == 'json':
            return json.dumps(self.__dict__)
        elif type == 'pickle':
            return pickle.dumps(self.__dict__)
        elif type == 'msgpack':
            return msgpack.dumps(self.__dict__)
        else:
            raise NotImplementedError('type serialization is not implemented')


class SerializableCircleMixin(SerializableMixin, Circle): pass


scm = SerializableCircleMixin(5)
print(scm.area)
print(scm.dumps('json'))


# 2 decorator
def dumps(cls):
    def _dumps(self, type='json'):
        if type == 'json':
            return json.dumps(self.__dict__)
        elif type == 'pickle':
            return pickle.dumps(self.__dict__)
        elif type == 'msgpack':
            return msgpack.dumps(self.__dict__)
        else:
            raise NotImplementedError('type serialization is not implemented')

    cls.dumps = _dumps
    return cls


@dumps
class SerializableRectangle(Rectangle): pass


sr = SerializableRectangle(height=4, width=5)
print(sr.area)
print(sr.dumps('json'))

 

posted @ 2020-10-04 13:38  ascertain  阅读(262)  评论(0编辑  收藏  举报