先看一段代码:
1 class People: 2 school = 'luffycity' 3 4 def __int__(self, name, age, sex): 5 self.name = name 6 self.age = age 7 self.sex = sex 8 9 10 class Teacher(People):11 12 def __init__(self, name, age, sex, level, salary):13 super().__int__(name, age, sex)14 self.level = level15 self.salary = salary16 17 def teach(self):18 print('%s is teaching' % self.name)19 20 21 class Student(People):22 23 def __init__(self, name, age, sex, class_time):24 super().__int__(name, age, sex)25 self.class_time = class_time26 27 def learn(self):28 print('%s is learning' % self.name)29 30 31 teacher1 = Teacher('alex', 18, 'male', 10, 3000)32 student1 = Student('张三', 28, 'female', '08:30:00')33 print(teacher1.__dict__)34 print(student1.__dict__)35 36 结果为:37 38 { 'name': 'alex', 'age': 18, 'sex': 'male', 'level': 10, 'salary': 3000}39 { 'name': '张三', 'age': 28, 'sex': 'female', 'class_time': '08:30:00'}
如果要为,teacher类添加老师所教的课程信息,如课程名,课程价格,课程周期等,可以在init函数里面增加,但是如果多个老师教同一门课程,就会出现代码重复的问题,如下
代码所示:
1 class People: 2 school = 'luffycity' 3 4 def __int__(self, name, age, sex): 5 self.name = name 6 self.age = age 7 self.sex = sex 8 9 10 class Teacher(People):11 12 def __init__(self, name, age, sex, level, salary, course_name, course_price, cource_period):13 super().__int__(name, age, sex)14 self.level = level15 self.salary = salary16 self.course_name = course_name17 self.course_price = course_price18 self.course_period = cource_period19 20 def teach(self):21 print('%s is teaching' % self.name)22 23 24 class Student(People):25 26 def __init__(self, name, age, sex, class_time):27 super().__int__(name, age, sex)28 self.class_time = class_time29 30 def learn(self):31 print('%s is learning' % self.name)32 33 34 teacher1 = Teacher('alex', 18, 'male', 10, 3000, 'python', 3000, '3mons')35 teacher2 = Teacher('egon', 28, 'male', 30, 2000, 'python', 3000, '3mons')36 student1 = Student('张三', 28, 'female', '08:30:00')37 print(teacher1.__dict__)38 print(teacher2.__dict__)39 print(student1.__dict__)40 41 结果为:42 43 { 'name': 'alex', 'age': 18, 'sex': 'male', 'level': 10, 'salary': 3000, 'course_name': 'python', 'course_price': 3000, 'course_period': '3mons'}44 { 'name': 'egon', 'age': 28, 'sex': 'male', 'level': 30, 'salary': 2000, 'course_name': 'python', 'course_price': 3000, 'course_period': '3mons'}45 { 'name': '张三', 'age': 28, 'sex': 'female', 'class_time': '08:30:00'}
怎样解决代码重复问题,可以新加一个course类:如下所示:
1 class Course:2 def __init__(self, course_name, course_price, course_period):3 self.course_name = course_name4 self.course_price = course_price5 self.course_period = course_period
但是,course类和teacher类并没有继承关系,而是一种老师有课程的关系,这样就讲到了组合的用处,就是为了teacher这样的类访问course这样的类的方法,实例如下:
1 python = Course('python', 3000, '3mons')2 3 teacher1.course = python4 teacher2.course = python5 6 print(python)7 print(teacher1.course)8 print(teacher2.course)
把teacher1的course属性指向一个course实例化对象python,这样执行teacher1.course.就相当于执行python.
结果如下:
1 <__main__.Course object at 0x000001F01BFC3BA8>2 <__main__.Course object at 0x000001F01BFC3BA8>3 <__main__.Course object at 0x000001F01BFC3BA8>4 5 为同一块内存地址
1 print(python.course_name) 2 3 print(teacher1.course.course_name) 4 print(teacher2.course.course_name) 5 6 结果为: 7 8 python 9 python10 python
为course添加tell_info 方法,
1 def tell_info(self):2 print('课程名<%s> 课程价钱<%s> 课程周期<%s>' % (self.course_name, self.course_price, self.course_period))
teacher1.course.tell_info()的执行结果为:
课程名课程价钱<3000> 课程周期<3mons>
增加linux实例化对象:
linux = Course('linux', 2000, '4mons')student1学了两门课程student1.course1 = pythonstudent1.course2 = linux查询student1学的课程信息
student1.course1.tell_info() student1.course2.tell_info() 结果为:
课程名课程价钱<3000> 课程周期<3mons> 课程名 课程价钱<2000> 课程周期<4mons>
增加一个Date类:
1 class Date: 2 def __init__(self, year, mon, day): 3 self.year = year 4 self.mon = mon 5 self.day = day 6 7 def tell_info(self): 8 print('%s-%s-%s' % (self.year, self.mon, self.day)) 9 10 实例话一个Date对象d11 d = Date(1988, 4, 20)12 student1.birth = d13 student1.birth.tell_info()14 student1.course1.tell_info()15 16 结果为: 17 1988-4-2018 课程名课程价钱<3000> 课程周期<3mons>