python怎样自定义类来保存其他自定义类的数据,并支持[]的查询运算?

我自定义一个学生类student,每个学生有姓名,学号,爱好,性别、出生年月等属性,还有一个做作业的函数,do_homework()
我还有一个group的类,group中含有好几个学生。
现在让groupA中名叫张三的人做作业,调用groupA["张三"].do_homework()

问题:
1、group中采用什么样的数据结构来保存学生变量比较好?
2、怎样才能支持语句 groupA["张三"].do_homework()?

谢谢

阅读 4k
2 个回答
#!/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()])
个人还是比较喜欢直白的描述

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();
  
}

如果只是要支持groupA['张三'].do_homework()这个用法的话,直接用dict就搞定了。如果你的group还有其他的功能的话,还可以考虑这样:

class Group(dict):
    
    def some_method(self):
        pass
        
groupA = Group([('张三', Student(...)), ('李四', Student(...)])
groupA['张三'].do_homework()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题