Skip to content

Commit 6f1bff4

Browse files
committed
initial
1 parent c4b7b63 commit 6f1bff4

File tree

1 file changed

+66
-0
lines changed

1 file changed

+66
-0
lines changed

07-annotations.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
from math import pi
2+
3+
4+
class TypeChecker:
5+
required_type = object
6+
7+
def __init__(self, name=None):
8+
self.name = name
9+
10+
def __get__(self, instance, owner=None):
11+
return instance.__dict__[self.name]
12+
13+
def __set__(self, instance, value):
14+
assert isinstance(value, self.required_type), \
15+
f'Booooo! Expecting a {self.required_type.__name__}'
16+
instance.__dict__[self.name] = value
17+
18+
19+
def type_check(cls):
20+
for var_name, var_type in cls.__annotations__.items():
21+
class Checker(TypeChecker):
22+
required_type = var_type
23+
24+
setattr(cls, var_name, Checker(var_name))
25+
return cls
26+
27+
28+
@type_check
29+
class Point:
30+
x: int
31+
y: int
32+
33+
def __init__(self, x, y):
34+
self.x = x
35+
self.y = y
36+
37+
def move_by(self, dx, dy):
38+
self.x += dx
39+
self.y += dy
40+
41+
def __str__(self):
42+
return f'A Point at {self.x}, {self.y}'
43+
44+
def __repr__(self):
45+
return f'{self.__class__.__name__}({self.x}, {self.y})'
46+
47+
48+
@type_check
49+
class Circle:
50+
center: Point
51+
radius: int
52+
53+
def __init__(self, center, radius):
54+
self.center = center
55+
self.radius = radius
56+
57+
@property
58+
def area(self):
59+
return pi * self.radius ** 2
60+
61+
def __str__(self):
62+
return f'A Circle at {self.center.x}, {self.center.y} and ' + \
63+
f'radius {self.radius}'
64+
65+
def __repr__(self):
66+
return f'{self.__class__.__name__}({self.center!r}, {self.radius!r})'

0 commit comments

Comments
 (0)