参考资料:传送门
讲的超级清楚阿、
看下下面的代码总结一下:其实就是代码复用
类似新增加一个函数去处理非负部分,之后在需要非负处理的地方调用该函数就行,这是C中的思路
比如你要处理所有的坐标中的x还是y都要求是非负数
用装饰器是下面的结果
如果不用的话你在使用add和sub两个函数的时候要在两个函数中加上相同的一段代码去处理是的坐标非负的情况
所以最终的结果就是这样
class Coordinate(object):
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return "Coord : " + str(self.__dict__)
def wrapper(func):
def checker(a, b):
if a.x < 0 or a.y < 0:
a = Coordinate(a.x if a.x > 0 else 0, a.y if a.y > 0 else 0)
if b.x < 0 or b.y < 0:
b = Coordinate(b.x if b.x > 0 else 0, b.y if b.y > 0 else 0)
ret = func(a, b)
if ret.x < 0 or ret.y < 0:
ret = Coordinate(ret.x if ret.x > 0 else 0, ret.y if ret.y > 0 else 0)
return ret
return checker
@wrapper
def add(a, b):
return Coordinate(a.x + b.x, a.y + b.y)
@wrapper
def sub(a, b):
return Coordinate(a.x - b.x, a.y - b.y)
if __name__ == '__main__':
one = Coordinate(100, 200)
two = Coordinate(300, 200)
three = Coordinate(-100, -100)
print sub(one, two)
print add(one, three)