2016-07-12 4 views
0

Ich erkunde Zusammensetzung (hat eine Beziehung) Logik in Python und dafür habe ich eine Klasse Student, die eine Address hat. Ich versuche mehrere Schülerdatensätze zu speichern, indem ich student_dict in Student verwende. Ich habe eine subclass ing Student. Ich benutze ein Wörterbuch und setze ID als Schlüssel und speichere die entsprechenden Details wie Name, Alter, Abteilung als Wert. Später, wenn ich versuche, Adresse des Studenten hinzuzufügen, wird es kompliziert, wenn versucht wird, auf sie zuzugreifen. Beispiel: student_dict.get(id)[1])[2]Wie verwende ich Wörterbuch für einfacheren Aufruf von Attributen

Meine Frage ist beim Hinzufügen der Adresse ich an die vorhandenen Details des Schülers anhängen. Dies fügt die Adresse als Tupel hinzu und wenn es darauf ankommt, wird es mühsam, sie mit zusätzlicher Indizierung abzurufen. Sie können dies in add_address() Methode innerhalb Student und get_course() Methode in beziehen. Unten ist der Code und Aufruf. Kann jemand einen Spaziergang machen und einen Weg vorschlagen, so dass ich leichter auf die Werte zugreifen kann als auf die multidimensionale Indexierung?

class Address(object): 

    def __init__(self, street, pin): 
     self.street = street 
     self.pin = pin 

    def __str__(self): 
     return "Address: {} {}".format(self.street, self.pin) 

class Student(object):  
    # Composition 
    student_dict = {} 

    def add_address(self, id, street, pin): 
     self.address = Address(street, pin) 
     self.student_dict[id] = self.student_dict[id], self.address 

    def get_address(self, id): 
     if (self.is_exists(id)): 
      return self.get(id)[1] 
     else: 
      print "<No Student record found>" 
      return "" 

    def put(self, id, details): 
     if id in self.student_dict.keys(): 
      print "Student %d already exists" %id 
      return 
     self.student_dict[id] = details 

    ... 

# class 

# Class that extends Student 
class GraduateStudent(Student): 

    def put(self, id, *args): 
     super(GraduateStudent, self).put(id, args) 
    # def 

    def get_course(self, id): 
     if (self.is_exists(id)): 
      return (self.get(id)[0])[2] 
     else: 
      print "<No record found>" 
      return "" 
    # def 

# class 

Invocations:

s = GraduateStudent() 
s.put(1, "Swad", 17, "Computer Science") 
s.put(2, "Vish", 18, "MECH.") 
s.put(3, "Vino", 18, "MECH.") 

s.add_address(1, "11 vvk street", 600015) 
s.add_address(2, "22 vvk street", 600015) 
s.add_address(3, "33 vvk street", 600015) 

print "\nStudent details::" 
print 1,": COURSE: ", s.get_course(1), ",", s.get_address(1) 
print 2,": COURSE: ", s.get_course(2), ",", s.get_address(2) 
print 3,": COURSE: ", s.get_course(3), ",", s.get_address(3) 

Ergebnis:

Student details:: 
1 : COURSE: Computer Science , Address: 11 vvk street 600015 
2 : COURSE: MECH. , Address: 22 vvk street 600015 
3 : COURSE: MECH. , Address: 33 vvk street 600015  
+1

Es scheint mir ** Adresse ** und ** Studenten ** sind nur statisch, wo die Methoden in einer Container-Klasse leben sollte, wie 'Studenten 'Witz h ein dict von ** id ** s zeigt auf jedes namedtuple 'Student', und jeder kann eine Eigenschaft haben, die auf seine' Adresse' zeigt. – Anzel

Antwort

2

definieren Sie die Einzelheiten der Klassen Schüler und Graduate als Attribute. Jede Instanz kann studentid durch die Definition einer Klasse Attribut eine eindeutige ID haben:

class Student(object): 
    studentid = -1 
    def __init__(self, name, dob): 
     Student.studentid += 1 
     self.id = Student.studentid 
     self.details = dict() 
     self.name = name 
     # Date of birth more useful than age :) 
     self.dob = dob 
     self.address = "" 

    def add_address(self, street, pin): 
     self.address = Address(street, pin) 

    def get_address(self): 
     return self.address 

    def __str__(self): 
     return "{}: Name {}, Address: {}".format(self.id, self.name, self.address) 

class GraduateStudent(Student): 
    def __init__(self, name, dob, course): 
     super(GraduateStudent, self).__init__(name, dob) 
     self.course = course 
    def __str__(self): 
     return "{}: Name: {}, Course: {}, Address: {}".format(self.id, self.name, self.course, self.address) 

Um den Überblick über die Liste der Studenten zu halten, können Sie eine Directory-Klasse definieren, in dem Sie die Schüler hinzufügen wird:

class Directory(object): 
    def __init__(self): 
     self.student_dict = dict() 

    def add_student(self, student): 
     if student.id in self.student_dict: 
      print "Student %d already exists" % student.id 
      return 
     self.student_dict[student.id] = student 
     return student.id 

    def get_student(self, id): 
     try: 
      return self.student_dict[id] 
     except KeyError: 
      print "<No Student record found: %d>" % id 
      return None 

    def add_address(self, id, street, pin): 
     student = self.get_student(id) 
     if student is not None: 
      student.add_address(street, pin) 

    def get_address(self, id): 
     student = self.get_student(id) 
     if student is not None: 
      return student.get_address() 

    def print_students(self): 
     for student in self.student_dict.values(): 
      print student 

nun die Schüler-Liste zu bearbeiten, können Sie schreiben:

>>> d = Directory() 
>>> id1 = d.add_student(GraduateStudent('Swad', 1999, 'Computer Science')) 
>>> id2 = d.add_student(GraduateStudent('Vish', 1998, 'MECH.')) 
>>> id3 = d.add_student(GraduateStudent('Vino', 1998, 'MECH.')) 
>>> d.add_address(id1, "11 vvk street", 600015) 
>>> d.add_address(id2, "22 vvk street", 600015) 
>>> d.add_address(id3, "33 vvk street", 600015) 
>>> d.print_students() 
0: Name: Swad, Course: Computer Science, Address: Address: 11 vvk street 600015 
1: Name: Vish, Course: MECH., Address: Address: 22 vvk street 600015 
2: Name: Vino, Course: MECH., Address: Address: 33 vvk street 600015 
+0

Sinnvoll und sehr klar zu verstehen. Danke für das Teilen! –

Verwandte Themen