-
Notifications
You must be signed in to change notification settings - Fork 0
/
two_d_movable.py
53 lines (42 loc) · 1.24 KB
/
two_d_movable.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
'''
Use case depicting the power of Contract @borrow functions that provide a place for
implementing common functionality
Inspired by http://www.codingexplorer.com/protocol-extensions-in-swift-2/
Thanks to CodingExplorer
'''
from contracts_core import Contract, required, borrow
class TwoDMovable(object):
@required
def relativeMoveBy(self, x, y): pass
@borrow()
def moveHorizontally(self, lateralMove):
'''
powerful abstraction happening here. moveHorizontally does not care what the underlying
implementation of relativeMoveBy() is. As we see below Circle class has different implementation
as Point class
'''
self.relativeMoveBy(lateralMove, 0)
@Contract(TwoDMovable)
class Point(object):
def __init__(self, x, y):
self.x = x
self.y = y
def relativeMoveBy(self, x, y):
self.x += x
self.y += y
@Contract(TwoDMovable)
class Circle(object):
def __init__(self, centerX, centerY, radius):
self.centerX = centerX
self.centerY = centerY
self.radius = radius
def relativeMoveBy(self, x, y):
self.centerX += 2+x
self.centerY += 2+y
if __name__ == '__main__':
p = Point(3,4)
p.moveHorizontally(3)
print p.x, p.y #Point at (6, 4)
c = Circle(10, 15, 5)
c.moveHorizontally(5)
print c.centerX, c.centerY #Center at (17,17)