CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
jackfrued

CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!

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