• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Atrybuty w Pythonie

Object Storage Arubacloud
0 głosów
441 wizyt
pytanie zadane 25 listopada 2021 w Python przez doskanoness Obywatel (1,240 p.)
edycja 25 listopada 2021 przez doskanoness

Hejka, mam takie pytanie. Mam taką klasę w Pythonie:

class SubjectTest(abc.ABC):
    def __init__(self, questions=None, date=None, num_questions=10):
        self.questions = [] if questions is None else questions
        self.points = 0
        self.date = date
        self.num_questions = num_questions

    def add_question(self, question):
        self.questions.append(question)

    def add_questions(self, *questions):
        self.questions.extend(questions)

    def max_points(self):
        return len(self.questions)

    def percent_progress(self):
        return self.points / self.max_points() * 100

    def grade(self):
        return to_grade(self.percent_progress())

    # ...

class Subject:
    def __init__(self, name, tests=None):
        self.name = name
        self.tests = [] if tests is None else tests

    def add_test(self, test):
        self.tests.append(test)

    def remove_test(self, test):
        self.tests.remove(test)

    def take_test(self, test):
        if test not in self.tests:
            raise ValueError(f'Error: given test is not available for the subject "{self.name}".')
        test.quiz()

    def grades(self):
        return [test.grade() for test in self.tests]

    def points(self):
        return [test.points for test in self.tests]

    def average_percentage(self):
        return sum(test.points for test in self.tests) / sum(test.max_points() for test in self.tests)

    def average_grade(self):
        return to_grade(self.average_percentage())

Chcę, aby można było mieć dostęp do metod average_percentage, average_grade itd. w ten sposób:

maths = Subject(name='Matma')
maths.take_test(maths_exam)
print(maths.average_grade) # maths.average_grade zamiast maths.average_grade()

Czy użycie dekoratora @property w tym celu to dobry sposób? Chcę to po to zrobić ponieważ w klasie SubjectTest mam takie publiczne zmienne jak points, date, num_questions i takie metody jak grade, max_points, które pobierają dane na podstawie właściwości tylko w odpowiednio przetworzonej formie (grade w tym wypadku konwertuje zdobyte punkty na stopień) i chcę ujednolicić kod, nie chcę mieszać wywołań funkcji i odwołań do zmiennych.

1 odpowiedź

+3 głosów
odpowiedź 25 listopada 2021 przez adrian17 Ekspert (344,860 p.)

Czy użycie dekoratora @property w tym celu to dobry sposób?

Tak :) Tak samo z np `max_points`.

 

Uwagi na boku:

class SubjectTest(abc.ABC):

Raczej nie ma sensu, że to jest ABC.

def average_percentage(self):
    return sum(test.points for test in self.tests) / sum(test.max_points() for test in self.tests)

To raczej nie jest dobry wzór. Wyobraź sobie że na jednym teście ktoś dostał 5/100 (5%), a na następny się pouczył i dostał 10/10 (100%). To z tego wzoru wychodzi że ma "średnią" 15/110 (~13%).

komentarz 25 listopada 2021 przez doskanoness Obywatel (1,240 p.)

Taki wzór będzie ok?

return sum(test.percent_progress for test in self.tests) / len(self.tests)

Czy dobrym pomysłem jest rzucanie wyjątków w właściwościach?

Mam kod:

@property
def average_points(self):
    return sum(test.points for test in self.tests) / len(self.tests)

i chcę rzucić wyjątek gdy len(self.test) będzie równe 0.

1
komentarz 25 listopada 2021 przez reaktywny Nałogowiec (40,990 p.)
Ja raczej bym sprawdzał czy nie ma dzielenia przez zero. Chociaż nie wiem jaką logikę tutaj chcesz zaimplementować.

Podobne pytania

0 głosów
1 odpowiedź 584 wizyt
pytanie zadane 30 listopada 2020 w Java przez Kuciniak Użytkownik (920 p.)
0 głosów
1 odpowiedź 467 wizyt
pytanie zadane 30 kwietnia 2018 w Java przez Adrian Paź Obywatel (1,270 p.)
0 głosów
1 odpowiedź 257 wizyt

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...