| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- """
- 魔术方法
- 如果要把自定义对象放到set或者用作dict的键
- 那么必须要重写__hash__和__eq__两个魔术方法
- 前者用来计算对象的哈希码,后者用来判断两个对象是否相同
- 哈希码不同的对象一定是不同的对象,但哈希码相同未必是相同的对象(哈希码冲撞)
- 所以在哈希码相同的时候还要通过__eq__来判定对象是否相同
- """
- class Student():
- __slots__ = ('stuid', 'name', 'gender')
- def __init__(self, stuid, name):
- self.stuid = stuid
- self.name = name
- def __hash__(self):
- return hash(self.stuid) + hash(self.name)
- def __eq__(self, other):
- return self.stuid == other.stuid and \
- self.name == other.name
- def __str__(self):
- return f'{self.stuid}: {self.name}'
- def __repr__(self):
- return self.__str__()
- class School():
- def __init__(self, name):
- self.name = name
- self.students = {}
- def __setitem__(self, key, student):
- self.students[key] = student
- def __getitem__(self, key):
- return self.students[key]
- def main():
- # students = set()
- # students.add(Student(1001, '王大锤'))
- # students.add(Student(1001, '王大锤'))
- # students.add(Student(1001, '白元芳'))
- # print(len(students))
- # print(students)
- stu = Student(1234, '骆昊')
- stu.gender = 'Male'
- # stu.birth = '1980-11-28'
- print(stu.name, stu.birth)
- school = School('千锋教育')
- school[1001] = Student(1001, '王大锤')
- school[1002] = Student(1002, '白元芳')
- school[1003] = Student(1003, '白洁')
- print(school[1002])
- print(school[1003])
- if __name__ == '__main__':
- main()
|