2016-07-12 9 views
0

私はPythonで構成(has-a関係)ロジックを調べています。このためにはAddressのクラスStudentがあります。学生の中でstudent_dictを使って複数の生徒記録を保存しようとしています。私はGraduateStudentsubclass ing Studentを持っています。私は辞書を使い、IDをキーに設定し、名前、年齢、部署などの対応する詳細を値として格納します。後で学生の住所を追加しようとすると、アクセスしようとすると複雑になります。例:student_dict.get(id)[1])[2]より簡単に属性を呼び出すための辞書の使い方

私の質問は、学生の既存の詳細に住所を追加することです。これにより、タプルとしてアドレスが追加され、アクセスするときに、追加の索引付けでフェッチするのが面倒になります。 の方法Studentget_course()の方法でこれをGraduateStudentで参照できます。以下はコードと呼び出しです。誰かが歩き回って、多次元の索引付けではなく値に簡単にアクセスできる方法を提案できますか?

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 

呼び出し:

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) 

結果:

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

それは私には思える**住所**と**学生**は、単に静的で'ウィットh ** id **はそれぞれの名前付きタプル 'Student'を指し、それぞれは' Address'を指し示すプロパティを持つことができます – Anzel

答えて

2

ただ属性として、クラスの学生とGraduateStudentの詳細を定義します。各インスタンスはクラス属性studentid定義することによって、一意のIDを持つことができます。

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 

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) 

は、学生のリストを追跡するために、あなたは生徒を追加するディレクトリクラスを定義することができます生徒のリストを操作する今

、あなたが書くことができます方法は学生 `のように、コンテナクラスに住むべき場所

>>> 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

理解して理解するのが非常に明確です。共有ありがとう! –

関連する問題