پروژه: دریافت اطلاعات آب و هوا با استفاده از کلاسها و API
اهداف پروژه
- تمرین استفاده از کلاسهای انتزاعی و ارثبری
- پیادهسازی متدهای انتزاعی در کلاسهای فرزند
- تمرین کار با APIهای خارجی و کتابخانه requests
- پردازش و نرمالسازی دادههای JSON
- ساخت برنامه تعاملی برای دریافت دما و رطوبت
۱. وارد کردن ماژولها و تعریف متغیرهای سراسری
from abc import ABC, abstractmethod
import requests
وارد کردن کتابخانههای مورد نیاز: abc برای کلاسهای انتزاعی و requests برای کار با API
۲. تعریف کلاس انتزاعی آب و هوا
class WeatherAbstract(ABC):
@abstractmethod
def get_current_weather(self, lat, lon):
pass
کلاس انتزاعی که هر کلاس فرزند باید متد get_current_weather را پیادهسازی کند
۳. کلاس دریافت آب و هوا از OpenWeather
class OpenWeatherProvider(WeatherAbstract):
base_url = "https://api.openweathermap.org/data/2.5/weather"
def __init__(self, api_key):
self.api_key = api_key
def get_current_weather(self, lat, lon):
params = {
"lat": lat,
"lon": lon,
"appid": self.api_key
}
response = requests.get(self.base_url, params=params)
normalize_data = {"temp": float(response.json()["main"]["temp"]) - 273.15,
"humidity": response.json()["main"]["humidity"]}
return normalize_data
کلاس برای دریافت دما و رطوبت از API OpenWeather و تبدیل دما از کلوین به سانتیگراد
۴. کلاس دریافت آب و هوا از OpenMeteo
class OpenMeteoProvider(WeatherAbstract):
base_url = "https://api.open-meteo.com/v1/forecast"
def get_current_weather(self, lat, lon):
params = {
"latitude": lat,
"longitude": lon,
"current": "temperature_2m,relative_humidity_2m"
}
response = requests.get(self.base_url, params=params)
normalize_data = {"temp": response.json()["current"]["temperature_2m"],
"humidity": response.json()["current"]["relative_humidity_2m"]}
return normalize_data
کلاس برای دریافت دما و رطوبت از API OpenMeteo و نرمالسازی دادهها
۵. اجرای برنامه و دریافت دادهها
provider = OpenWeatherProvider("token")
print(provider.get_current_weather(lat=35.82472320684597, lon=51.00105750513447))
ایجاد نمونهای از کلاس OpenWeatherProvider و دریافت اطلاعات آب و هوا برای مختصات مشخص