example16.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. """
  2. 魔术方法
  3. 如果要把自定义对象放到set或者用作dict的键
  4. 那么必须要重写__hash__和__eq__两个魔术方法
  5. 前者用来计算对象的哈希码,后者用来判断两个对象是否相同
  6. 哈希码不同的对象一定是不同的对象,但哈希码相同未必是相同的对象(哈希码冲撞)
  7. 所以在哈希码相同的时候还要通过__eq__来判定对象是否相同
  8. """
  9. class Student():
  10. __slots__ = ('stuid', 'name', 'gender')
  11. def __init__(self, stuid, name):
  12. self.stuid = stuid
  13. self.name = name
  14. def __hash__(self):
  15. return hash(self.stuid) + hash(self.name)
  16. def __eq__(self, other):
  17. return self.stuid == other.stuid and \
  18. self.name == other.name
  19. def __str__(self):
  20. return f'{self.stuid}: {self.name}'
  21. def __repr__(self):
  22. return self.__str__()
  23. class School():
  24. def __init__(self, name):
  25. self.name = name
  26. self.students = {}
  27. def __setitem__(self, key, student):
  28. self.students[key] = student
  29. def __getitem__(self, key):
  30. return self.students[key]
  31. def main():
  32. # students = set()
  33. # students.add(Student(1001, '王大锤'))
  34. # students.add(Student(1001, '王大锤'))
  35. # students.add(Student(1001, '白元芳'))
  36. # print(len(students))
  37. # print(students)
  38. stu = Student(1234, '骆昊')
  39. stu.gender = 'Male'
  40. # stu.birth = '1980-11-28'
  41. print(stu.name, stu.birth)
  42. school = School('千锋教育')
  43. school[1001] = Student(1001, '王大锤')
  44. school[1002] = Student(1002, '白元芳')
  45. school[1003] = Student(1003, '白洁')
  46. print(school[1002])
  47. print(school[1003])
  48. if __name__ == '__main__':
  49. main()