Skip to content

Commit f7aecec

Browse files
committed
Inheritance and Composition
1 parent 87cd1e2 commit f7aecec

File tree

1 file changed

+97
-0
lines changed

1 file changed

+97
-0
lines changed

type/inheritance

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
from typing import Iterable, Optional
2+
3+
class ImmutableNumberList:
4+
def __init__(self, elements: Iterable[int]):
5+
self.elements = [element for element in elements]
6+
7+
def first(self) -> Optional[int]:
8+
if not self.elements:
9+
return None
10+
return self.elements[0]
11+
12+
def last(self) -> Optional[int]:
13+
if not self.elements:
14+
return None
15+
return self.elements[-1]
16+
17+
def length(self) -> int:
18+
return len(self.elements)
19+
20+
def largest(self) -> Optional[int]:
21+
if not self.elements:
22+
return None
23+
largest = self.elements[0]
24+
for element in self.elements:
25+
if element > largest:
26+
largest = element
27+
return largest
28+
29+
30+
class SortedImmutableNumberList(ImmutableNumberList):
31+
def __init__(self, elements: Iterable[int]):
32+
super().__init__(sorted(elements))
33+
34+
def largest(self) -> Optional[int]:
35+
return self.last()
36+
37+
def max_gap_between_values(self) -> Optional[int]:
38+
if not self.elements:
39+
return None
40+
previous_element = None
41+
max_gap = -1
42+
for element in self.elements:
43+
if previous_element is not None:
44+
gap = element - previous_element
45+
if gap > max_gap:
46+
max_gap = gap
47+
previous_element = element
48+
return max_gap
49+
50+
51+
values = SortedImmutableNumberList([1, 20, 7, 13, 4])
52+
print(values.largest())
53+
print(values.max_gap_between_values())
54+
55+
unsorted_values = ImmutableNumberList([1, 19, 7, 13, 4])
56+
print(unsorted_values.largest())
57+
# print(unsorted_values.max_gap_between_values()). 'ImmutableNumberList' object has no attribute 'max_gap_between_values'
58+
59+
60+
61+
class Parent:
62+
def __init__(self, first_name: str, last_name: str):
63+
self.first_name = first_name
64+
self.last_name = last_name
65+
66+
def get_name(self) -> str:
67+
return f"{self.first_name} {self.last_name}"
68+
69+
70+
class Child(Parent):
71+
def __init__(self, first_name: str, last_name: str):
72+
super().__init__(first_name, last_name)
73+
self.previous_last_names = []
74+
75+
def change_last_name(self, last_name) -> None:
76+
self.previous_last_names.append(self.last_name)
77+
self.last_name = last_name
78+
79+
def get_full_name(self) -> str:
80+
suffix = ""
81+
if len(self.previous_last_names) > 0:
82+
suffix = f" (née {self.previous_last_names[0]})"
83+
return f"{self.first_name} {self.last_name}{suffix}"
84+
85+
person1 = Child("Elizaveta", "Alekseeva")
86+
print(person1.get_name())
87+
print(person1.get_full_name())
88+
person1.change_last_name("Tyurina")
89+
print(person1.get_name())
90+
print(person1.get_full_name())
91+
92+
person2 = Parent("Elizaveta", "Alekseeva")
93+
print(person2.get_name())
94+
# print(person2.get_full_name()) 'Parent' object has no attribute 'get_full_name'
95+
# person2.change_last_name("Tyurina") 'Parent' object has no attribute 'change_last_name'
96+
print(person2.get_name())
97+
# print(person2.get_full_name()) 'Parent' object has no attribute 'get_full_name'

0 commit comments

Comments
 (0)