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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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,050
Threads: 487
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:
1 2 3 4 5 6 7 8 |
def run_prog():
student = Student()
uni_class = UniClass()
student1 = student( 'Harry' , ...
...
if __name__ = = '__main__' :
run_prog()
|
Posts: 4,804
Threads: 77
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
1 2 3 4 5 6 7 8 9 10 11 12 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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:
1 |
assert isinstance ( getattr (Student, "name" ), property )
|
Error: AttributeError: type object 'Student' has no attribute 'name'
Posts: 4,804
Threads: 77
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?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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,804
Threads: 77
Joined: Jan 2018
Use a modified attribute to avoid clashes between the property and the attribute, for example
1 2 3 |
@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
1 2 3 |
@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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
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
@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:
1 2 3 4 5 6 7 8 9 |
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,804
Threads: 77
Joined: Jan 2018
You need to define self._students = set() in the __init__ method.
|