Skip to content

Commit d8f240c

Browse files
authored
Merge pull request #8 from dancergraham/feature/observer
feature: Complete the weather station code
2 parents d65c53d + 50033b0 commit d8f240c

File tree

1 file changed

+69
-9
lines changed

1 file changed

+69
-9
lines changed

chapter02_observer/weather.py

+69-9
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,29 @@
11
class Subject:
2-
def register_observer():
2+
def register_observer(self, observer):
33
raise NotImplementedError
44

5-
def remove_observer():
5+
def remove_observer(self, observer):
66
raise NotImplementedError
77

8-
def notify_observers():
8+
def notify_observers(self):
99
raise NotImplementedError
1010

1111

1212
class Observer:
13-
def update():
13+
def update(self, temp, humidity, pressure):
1414
raise NotImplementedError
1515

1616

1717
class DisplayElement:
18-
def display():
18+
def display(self):
1919
raise NotImplementedError
2020

2121

2222
class WeatherData(Subject):
2323
def __init__(self):
24+
self._temperature = None
25+
self._humidity = None
26+
self._pressure = None
2427
self._observers = []
2528

2629
def register_observer(self, observer: Observer):
@@ -49,23 +52,80 @@ def __init__(self, weather_data):
4952

5053
def display(self):
5154
print(
52-
f"Current conditions: {self._temperature:.1f}F degrees and {self._humidity:.1f}% humidity"
55+
f"Current conditions: "
56+
f"{self._temperature:.1f}F degrees and "
57+
f"{self._humidity:.1f}% humidity"
5358
)
5459

55-
def update(self, temperature: float, humidity: float, pressure: float):
56-
self._temperature = temperature
60+
def update(self, temp: float, humidity: float, pressure: float):
61+
self._temperature = temp
5762
self._humidity = humidity
5863
self.display()
5964

6065

66+
class StatisticsDisplay(DisplayElement, Observer):
67+
68+
def __init__(self, weather_data):
69+
self._max_temp = 0.
70+
self._min_temp = 200.
71+
self._temp_sum = 0.
72+
self._num_readings = 0
73+
self._weather_data = None
74+
self._weather_data = weather_data
75+
weather_data.register_observer(self)
76+
77+
def update(self, temp, humidity, pressure):
78+
self._temp_sum += temp
79+
self._num_readings += 1
80+
self._max_temp = max(temp, self._max_temp)
81+
self._min_temp = min(temp, self._min_temp)
82+
self.display()
83+
84+
def display(self):
85+
print(f"Avg/Max/Min temperature = "
86+
f"{self._temp_sum / self._num_readings}"
87+
f"/{self._max_temp}"
88+
f"/{self._min_temp}"
89+
)
90+
91+
92+
class ForecastDisplay(DisplayElement, Observer):
93+
94+
def __init__(self, weather_data):
95+
self._current_pressure = 29.92
96+
self._last_pressure = None
97+
self._weather_data = weather_data
98+
weather_data.register_observer(self)
99+
100+
def update(self, temp, humidity, pressure):
101+
self._last_pressure = self._current_pressure
102+
self._current_pressure = pressure
103+
self.display()
104+
105+
def display(self):
106+
print("Forecast: ", end="")
107+
if self._current_pressure > self._last_pressure:
108+
print("Improving weather on the way!")
109+
elif self._current_pressure == self._last_pressure:
110+
print("More of the same")
111+
elif self._current_pressure < self._last_pressure:
112+
print("Watch out for cooler, rainy weather")
113+
114+
61115
def weather_station():
62116
weather_data = WeatherData()
117+
63118
current_display = CurrentConditionsDisplay(weather_data)
64-
# statistics_display = StatisticsDisplay(weather_data)
119+
statistics_display = StatisticsDisplay(weather_data)
120+
forecast_display = ForecastDisplay(weather_data)
121+
65122
weather_data.set_measurements(80, 65, 30.4)
66123
weather_data.set_measurements(82, 70, 29.2)
67124
weather_data.set_measurements(78, 90, 29.2)
68125

126+
weather_data.remove_observer(forecast_display)
127+
weather_data.set_measurements(62, 90, 28.1)
128+
69129

70130
if __name__ == "__main__":
71131
weather_station()

0 commit comments

Comments
 (0)