-
Notifications
You must be signed in to change notification settings - Fork 1
/
ninja_dave.py
68 lines (57 loc) · 2.26 KB
/
ninja_dave.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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
class WaitASecondYouAreTotallyNotMyFriendError(Exception):
def __init__(self, ninja):
super().__init__(f"Hey ! Wait a second, you're not my friend ! You're {ninja} !")
class Ninja:
def __init__(self, name):
self.name = name
self.friends = set()
def introduce_to(self, ninja):
print(f"Hello {ninja}, my name is {self}")
self.friends.add(ninja); ninja.friends.add(self)
def date_with_a_ninja(self, ninja):
if ninja in self.friends:
print(f"Long time no see {ninja} !")
else:
raise WaitASecondYouAreTotallyNotMyFriendError(ninja)
def __repr__(self):
return self.name
# Hey Bob, nice Katana you've got there
bob_the_ninja = Ninja("Bob")
# Wow Mike, that's a dope Shuriken
mike_the_ninja = Ninja("Mike")
bob_the_ninja.introduce_to(mike_the_ninja)
bob_the_ninja.date_with_a_ninja(mike_the_ninja)
# Later that day...
mike_the_ninja.date_with_a_ninja(bob_the_ninja)
# Dave is only there for trouble, don't be like Dave
dave_the_ninja = Ninja("Dave")
def dave_trying_to_date_bob():
try: # Dave pretending to be Bob's friend
bob_the_ninja.date_with_a_ninja(dave_the_ninja)
except WaitASecondYouAreTotallyNotMyFriendError as e:
# Of course, Bob is not gullible and see through Dave's masquerade
print(e)
dave_trying_to_date_bob()
# Dave is not done, he'll try impersonating Mike
dave_the_ninja.name = "Mike"
# Will it work this time ?
dave_trying_to_date_bob()
class SneakyNinja(Ninja):
def __init__(self, name: str, usurpation_target: Ninja):
self.name = name
self.usurpation_target = usurpation_target
def __eq__(self, other_ninja):
result = self.usurpation_target == other_ninja
print(f"Am I ({self}) equal to {other_ninja} ? Answer is {result}")
return result
def __hash__(self):
result = self.usurpation_target.__hash__()
print(f"Hey, I'm {self} and my hash is {result}")
return result
def __repr__(self):
return f"{self.usurpation_target} (But it's {self.name} under the hood hehehe)"
# Dave is now trying harder to look like Mike
dave_the_ninja = SneakyNinja("Dave", mike_the_ninja)
# Will it work this time ?
dave_trying_to_date_bob()
print(dave_the_ninja is mike_the_ninja)