Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Classes and Methods
#1
Hello everyone,

started this semester with programming in python, and now we have a task where i dont know how to program it.
We get an UML diagram with two classes, one is "student", the other "uniclass".

class student
  • name: str
  • imt_name: str
  • semester: int
    ________________
  • Student(name, imt_name, semester)
  • __str__(): str

class UniClass
  • name: str
    ________________
  • UniClass(name)
  • enroll_student(student)
  • __str__(): str

Further i get following instructions:
  • Use getters for all attributes.
  • The method __str__ of Student returns the string "Jack (jack99) is in semester 20" for the student with name "Jack", IMT-name "jack99" and semester 20. Use exactly this format.
  • UniClass uses a set to store enrolled students.
  • enroll_student only inserts objects that are of type Student. Objects of other types should not be inserted.
  • The method __str__ of UniClass returns set() if no student is enrolled. For example, one returns "{Jack (jack99) is in semester 20}" and two returns "{Jack (jack99) is in semester 20, Jane (jane100) is in semester 20}" The order does not matter.
  • Tip: This is easy if you overwrite the __repr__ method of Student. For example, __repr__ is used by the __str__ method of the built-in collection types list, set, and dict to create a string representation of the contained objects.

So far I have written this code, but don't know what to do:

class Student:
    def __init__(name, imt_name, semester, *args, **kwargs):
        self.name = name
        self.imt_name = imt_name
        self.semester = semester
        
    def get_name(self):
        return self.name
    
    def get_imt_name(self):
        return self.imt_name
    
    def get_semester(self):
        return self.semester 
    
class UniClass:
    def __init__(name, *args, **kwargs):
        self.name = name
Reply
#2
you need to direct the running tasks.

you can add at end of script:

def run_prog():
    student = Student()
    uni_class = UniClass()
    student1 = student('Harry', ...
    ...

if __name__ == '__main__':
    run_prog()
Reply
#3
To complete Larz60+'s idea, add this to your code
def run_prog():
    jack = Student("Jack", "jack99", 20)
    assert str(jack) == "Jack (jack99) is in semester 20"
    jane = Student("Jane", "jane100", 20)
    assert str(jane) == "Jane (jane100) is in semester 20"
    cls = UniClass()
    cls.enroll_student(jack)
    cls.enroll_student(jane)
    assert eval(str(cls)) == {str(jack), str(jane)}

if __name__ == "__main__":
    run_prog()
Then change your classes code until the program runs.
Reply
#4
Thanks for your replies.

we have already given something to check it with:
assert type(Student) is type

student_jack = Student("Jack", "jack99", 20)
assert student_jack.name == "Jack"
assert student_jack.imt_name == "jack99"
assert student_jack.semester == 20

student_jack.semester = 21
assert student_jack.semester == 21


assert isinstance(getattr(Student, "name"), property)
assert isinstance(getattr(Student, "imt_name"), property)
assert isinstance(getattr(Student, "semester"), property)
There i get the Error:
assert isinstance(getattr(Student, "name"), property)
Error:
AttributeError: type object 'Student' has no attribute 'name'
Reply
#5
Then you're supposed to implement a property named "name" in the class instead of the get_name() method.
Reply
#6
ok i guess something like that?

class Student:
    def __init__(self, name, imt_name, semester, *args, **kwargs):
        self.name = name
        self.imt_name = imt_name
        self.semester = semester
        
    @property    
    def name(self):
        return self.name
    
    def get_imt_name(self):
        return self.imt_name
    
    def get_semester(self):
        return self.semester
    
    @name.setter
    def name(self, name):
        self.name = name
        
    def set_imt_name(self, imt_name):
        self.imt_name = imt_name
        
    def set_semester(self, semester):
        self.semester = semester
    
    def __str__(self):
        return(self.name, self.imt_name, self.semester)
    
class UniClass:
    def __init__(name, *args, **kwargs):
        self.name = name
But than i get following error:
---------------------------------------------------------------------------
RecursionError                            Traceback (most recent call last)
<ipython-input-21-66ae99a3ea56> in <module>
      2 assert type(Student) is type
      3 
----> 4 student_jack = Student("Jack", "jack99", 20)
      5 assert student_jack.name == "Jack"
      6 assert student_jack.imt_name == "jack99"

<ipython-input-20-2d17b754b915> in __init__(self, name, imt_name, semester, *args, **kwargs)
      1 class Student:
      2     def __init__(self, name, imt_name, semester, *args, **kwargs):
----> 3         self.name = name
      4         self.imt_name = imt_name
      5         self.semester = semester

<ipython-input-20-2d17b754b915> in name(self, name)
     17     @name.setter
     18     def name(self, name):
---> 19         self.name = name
     20 
     21     def set_imt_name(self, imt_name):

... last 1 frames repeated, from the frame below ...

<ipython-input-20-2d17b754b915> in name(self, name)
     17     @name.setter
     18     def name(self, name):
---> 19         self.name = name
     20 
     21     def set_imt_name(self, imt_name):

RecursionError: maximum recursion depth exceeded
Reply
#7
Use a modified attribute to avoid clashes between the property and the attribute, for example
@property
def name(self):
    return self._name
Reply
#8
(Nov-21-2018, 02:25 PM)Gribouillis Wrote: Use a modified attribute to avoid clashes between the property and the attribute, for example
@property
def name(self):
    return self._name
Ah thank you very much :)

Now my following code passes the first two tests, but now in the third i get another error.
my code so far:
class Student:
    def __init__(self, name, imt_name, semester, *args, **kwargs):
        self.name = name
        self.imt_name = imt_name
        self.semester = semester
        
    @property    
    def name(self):
        return self._name
    
    @property  
    def imt_name(self):
        return self._imt_name
    
    @property 
    def semester(self):
        return self._semester
    
    @name.setter
    def name(self, name):
        self._name = name
    
    @imt_name.setter
    def imt_name(self, imt_name):
        self._imt_name = imt_name
    
    @semester.setter
    def semester(self, semester):
        self._semester = semester
    
    def __str__(self):
        return(self.name, self.imt_name, self.semester)
    
class UniClass:
    def __init__(self, name, *args, **kwargs):
        self.name = name
        #self.students = students
        
    @property
    def name(self):
        return self.uname
    
    @name.setter
    def name(self, name):
        self.uname = name
        
    @property
    def students(self):
        return self._students
    
    @students.setter
    def name(self, students):
        self._students = students        
        
    def __str__(self):
        return(name)
and the code to test my code:
programming_class = UniClass("Programming")
student_jack = Student("Jack", "jack99", 20)
student_jane = Student("Jane", "jane100", 20)
assert programming_class.students == set()
assert type(programming_class.students) is set
programming_class.enroll_student(student_jack)
programming_class.enroll_student(student_jane)
programming_class.enroll_student("student_jane")
assert programming_class.students == {student_jack, student_jane}
with the error:
Error:
--------------------------------------------------------------------------- AssertionError Traceback (most recent call last) <ipython-input-38-dcca7e23946b> in <module> 3 student_jack = Student("Jack", "jack99", 20) 4 student_jane = Student("Jane", "jane100", 20) ----> 5 assert programming_class.students == set() 6 assert type(programming_class.students) is set 7 programming_class.enroll_student(student_jack) AssertionError:
its because of the missing method "enroll_student"?
When i insert this method, how can i test if the given object is from type student?
Reply
#9
You need to define self._students = set() in the __init__ method.
Reply


Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020