鍍金池/ 問答/Python/ python怎樣自定義類來保存其他自定義類的數(shù)據(jù),并支持[]的查詢運(yùn)算?

python怎樣自定義類來保存其他自定義類的數(shù)據(jù),并支持[]的查詢運(yùn)算?

我自定義一個(gè)學(xué)生類student,每個(gè)學(xué)生有姓名,學(xué)號(hào),愛好,性別、出生年月等屬性,還有一個(gè)做作業(yè)的函數(shù),do_homework()
我還有一個(gè)group的類,group中含有好幾個(gè)學(xué)生。
現(xiàn)在讓groupA中名叫張三的人做作業(yè),調(diào)用groupA["張三"].do_homework()

問題:
1、group中采用什么樣的數(shù)據(jù)結(jié)構(gòu)來保存學(xué)生變量比較好?
2、怎樣才能支持語句 groupA["張三"].do_homework()?

謝謝

回答
編輯回答
孤島

如果只是要支持groupA['張三'].do_homework()這個(gè)用法的話,直接用dict就搞定了。如果你的group還有其他的功能的話,還可以考慮這樣:

class Group(dict):
    
    def some_method(self):
        pass
        
groupA = Group([('張三', Student(...)), ('李四', Student(...)])
groupA['張三'].do_homework()
2017年11月26日 07:39
編輯回答
尐潴豬
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# date:        2017/12/2
# author:      he.zhiming
# 

from __future__ import absolute_import, unicode_literals


class Student:
    def __init__(self, name):
        self._name = name

    def get_name(self):
        return self._name

    def __repr__(self):
        return 'Student(%s)' % self._name


class Group:
    def __init__(self):
        self._name_to_student = {}

    def add_student(self, student):
        self._name_to_student[student.get_name()] = student

        return True

    def add_students(self, students):
        for s in students:
            self.add_student(s)

        return True

    def remove_student(self, student):
        return self._name_to_student.pop(student.get_name(), None)

    def get_students(self):
        return self._name_to_student.values()

    def __getitem__(self, item):
        return self._name_to_student[item]

    def __setitem__(self, key, value):
        self._name_to_student[key] = value


if __name__ == '__main__':
    s1 = Student('s1')
    s2 = Student('s2')

    g = Group()

    g.add_students((s1, s2))

    print(g[s1.get_name()])
個(gè)人還是比較喜歡直白的描述

export class Student {
  constructor(private _name: string) {
    
  }
  
  doHomework() {
    return 'student is doing homework';
  }
  
  get name(): string {
    return this._name;
  }
  set name(value: string) {
    this._name = value;
  }
}

export class Group {
  
  private name_to_student: Map<string, Student> = new Map();
  
  addStudent(student: Student) {
    this.name_to_student.set(student.name, student);
    
    return true;
  }
  
  addStudents(students: Student[]) {
    for (let s of students) {
      this.addStudent(s);
    }
    
    return true;
  }
  
  removeStudent(s: Student) {
    if (this.name_to_student.has(s.name)) {
      this.name_to_student.delete(s.name);
      return true;
    } else {
      return false;
    }
  }
  
  getStudent(studentName: string) {
    return this.name_to_student.get(studentName);
  }
  
}

function test() {
  const s1 = new Student('s1');
  const s2 = new Student('s2');
  
  const g = new Group();
  
  g.addStudents([s1, s2]);
  
  g.getStudent(s1.name).doHomework();
  
}
2017年12月28日 12:48