Понимание концепции класса - PullRequest
0 голосов
/ 25 октября 2018

Так что это может быть очень простой вещью для большинства из вас, но я только начинаю.

Ниже мой первый урок:

class WeatherYear:

    DEFAULT_MAX = -99
    DEFAULT_MIN = 999
    DEFAULT_STR = 'DATE'

    def __init__(self, year):
        self.year = year
        self.max_temp = WeatherYear.DEFAULT_MAX
        self.min_temp = WeatherYear.DEFAULT_MIN
        self.max_temp_date = WeatherYear.DEFAULT_STR
        self.max_humid = WeatherYear.DEFAULT_MAX
        self.min_humid = WeatherYear.DEFAULT_MIN

    def add_day(self, date, max_temp, min_temp, max_humid, min_humid):
        if max_temp and max_temp > self.max_temp:
            self.max_temp = max_temp
            self.max_temp_date = date
        if min_temp and min_temp < self.min_temp:
            self.min_temp = min_temp
        if max_humid and max_humid > self.max_humid:
            self.max_humid = max_humid
        if min_humid and min_humid < self.min_humid:
            self.min_humid = min_humid

А вот кое-чточто я использовал это для:

years_dict = {}
wy_obj = years_dict.get(year)

if not wy_obj:
    years_dict[year] = WeatherYear(year)
    wy_obj = years_dict[year]

    wy_obj.add_day(date, max_temp, min_temp, max_humid, min_humid)

Это часть моего кода, может кто-нибудь объяснить мне, что именно происходит, также основная часть, Нужно ли мне сохранить год в моем __init__ функция?Что если я уберу это?Будет ли это работать так же?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Вопрос> : Нужно ли мне сохранять год в моей функции init ?

Нет , поскольку вы сохраняете дату в self.max_temp_date, это удваивается, поскольку вы можете получить year от даты, используя self.max_temp_date.year.


Измените class WetherYear().__init__(... на следующее:

def __init__(self, measure):
    self.max_temp_date, self.max_temp, self.min_temp, self.max_humid, self.min_humid = measure

Таким образом, вам не нужно инициализировать атрибуты класса фиктивными значениями.Установите атрибуты сразу с первыми значениями measure.

Что касается вашего имени class methodes, назовите его , что делает эта функция.В этом случае вы не добавляете ничего, что обновляете class attributs по условию.

def add_day(self, date, max_temp, min_temp, max_humid, min_humid):
    if max_temp and max_temp > self.max_temp:
       ...

Вам не нужно get(... WeatherYear объект, чтобы проверить, существует ли этот year.используйте только ключ year.Также вам не нужно получать его снова wy_obj = years_dict[year], вы можете использовать его из dict например years_dict[year].add_day(...

wy_obj = years_dict.get(year)

if not wy_obj:
    years_dict[year] = WeatherYear(year)
    wy_obj = years_dict[year]
    wy_obj.add_day(...

Рассмотрите этот пример:

from datetime import date

class WeatherYear:
    def __init__(self, measure):
        self.max_temp_date, self.max_temp, self.min_temp, self.max_humid, self.min_humid = measure

    def update(self, measure):            
        if measure[1] > self.max_temp:
            self.max_temp_date = measure[0]
            self.max_temp = measure[1]

        if measure[2] > self.min_temp:
            self.min_temp = measure[2]

        if measure[3] > self.max_humid:
            self.max_humid = measure[3]

        if measure[4] > self.min_humid:
            self.min_humid = measure[4]

    def __str__(self):
       return "WeatherYear:In {year} at {self.max_temp_date}, measured a max temperature of {self.max_temp}°C and max humid of {self.max_humid} %".format(self=self, year=self.max_temp_date.year)


def main():
    #          date, max_temp, min_temp, max_humid, min_humid
    measurements = [(date(2018, 9, 10), 20, 8, 40, 30),
                    (date(2018, 9, 12), 25, 12, 50, 35),
                    (date(2018, 9, 13), 19, 10, 30, 25)]

    max_years = {}
    for measure in measurements:
        if not measure[0].year in max_years:
            max_years[measure[0].year] = WeatherYear(measure)
        else:
            max_years[measure[0].year].update(measure)

    for year in max_years:
        print("{}: {}".format(year, max_years[year]))


if __name__ == "__main__":
    main()

Выход :

2018: WeatherYear:In 2018 at 2018-09-12, measured a max temperature of 25°C, max humid of 50 %

Проверено на Python: 3.4.2

0 голосов
/ 25 октября 2018

Вы должны попробовать код, это лучший способ понять концепции ООП в Python.Возвращаясь к вашему вопросу, согласно вашему коду, вам нужно иметь год в вашей init функции, иначе self.year = year даст год не определенная ошибка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...