Posts: 4
Threads: 1
Joined: Nov 2018
Nov-21-2018, 10:10 AM
(This post was last modified: Nov-21-2018, 10:10 AM by thraxas.)
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
Posts: 12,031
Threads: 485
Joined: Sep 2016
Nov-21-2018, 10:16 AM
(This post was last modified: Nov-21-2018, 10:16 AM by Larz60+.)
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()
Posts: 4,790
Threads: 76
Joined: Jan 2018
Nov-21-2018, 10:37 AM
(This post was last modified: Nov-21-2018, 10:37 AM by Gribouillis.)
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.
Posts: 4
Threads: 1
Joined: Nov 2018
Nov-21-2018, 10:44 AM
(This post was last modified: Nov-21-2018, 10:51 AM by thraxas.)
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'
Posts: 4,790
Threads: 76
Joined: Jan 2018
Nov-21-2018, 10:59 AM
(This post was last modified: Nov-21-2018, 11:00 AM by Gribouillis.)
Then you're supposed to implement a property named "name" in the class instead of the get_name() method.
Posts: 4
Threads: 1
Joined: Nov 2018
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
Posts: 4,790
Threads: 76
Joined: Jan 2018
Use a modified attribute to avoid clashes between the property and the attribute, for example
@property
def name(self):
return self._name
Posts: 4
Threads: 1
Joined: Nov 2018
Nov-21-2018, 02:49 PM
(This post was last modified: Nov-21-2018, 02:49 PM by thraxas.)
(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?
Posts: 4,790
Threads: 76
Joined: Jan 2018
You need to define self._students = set() in the __init__ method.
|