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

Atrybuty w Pythonie

0 głosów
36 wizyt
pytanie zadane 2 dni temu w Python przez doskanoness Użytkownik (520 p.)
edycja 2 dni temu 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ź 2 dni temu przez adrian17 Ekspert (302,720 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 2 dni temu przez doskanoness Użytkownik (520 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 2 dni temu przez reaktywny Nałogowiec (27,410 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ź 155 wizyt
pytanie zadane 30 listopada 2020 w Java przez Kuciniak Użytkownik (940 p.)
0 głosów
1 odpowiedź 192 wizyt
pytanie zadane 30 kwietnia 2018 w Java przez Adrian Paź Obywatel (1,270 p.)
0 głosów
1 odpowiedź 140 wizyt
Porady nie od parady
Możesz ukryć, zamknąć lub zmodyfikować swoje pytanie, za pomocą przycisków znajdujących się pod nim. Nie krępuj się poprawić pochopnie opublikowanego pytania czy zamknąć go po uzyskaniu satysfakcjonującej odpowiedzi. Umożliwi to zachowanie porządku na forum.Przyciski pytania

85,708 zapytań

134,503 odpowiedzi

298,528 komentarzy

56,629 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...