面向对象.类的继承

1.子类可以继承一个或是多个父类,子类继承父类的所有公有实例属性和方法

2.继承实现了代码的重用以及个性化定制,减少代码量

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
#
# Authors: limanman
# OsChina: http://my.oschina.net/pydevops/
# Purpose:
#
"""
import pprint
import random


# 学校类
class School(object):
    """
    Attributes:
        student_list: school student list
        teacher_list: school teacher list
    """
    def __init__(self):
        # 学生列表
        self.student_list = []
        # 老师列表
        self.teacher_list = []

# 学生/老师公有类
class SchoolMember(object):
    """
    Attributes:
       name: school member name
       age : school member age
       sex : school member sex
    """
    # 公有实例属性
    def __init__(self, name, age, sex):
        self.name = name
        self.age  = age
        self.sex  = sex

class Student(SchoolMember):
    """
    Attributes:
        grade: student grade
    """
    def __init__(self, name, age, sex, school, grade):
        # 父类初始化
        SchoolMember.__init__(self, name, age, sex)
        self.grade = grade
        # 避免外部恶意调用(学生炸学校)
        self.__school = school
        # 学生入学校
        self.__school.student_list.append(self)

    def stu_study(self):
        print '''\
        name : %s
        age  : %s
        sex  : %s
        doing: %s
        ''' % (self.name, self.age, self.sex, 'study...')

    # 学生转校同步到学校
    def stu_transfer(self):
        """Student transfer to other school."""
        self.__school.student_list.remove(self)

class Teacher(SchoolMember):
    """
    Attributes:
        salary: teacher salary
    """
    def __init__(self, name, age, sex, school, salary):
        # 父类初始化
        SchoolMember.__init__(self, name, age, sex)
        self.salary = salary
        # 避免外部恶意调用(老师炸学校)
        self.__school = school

        self.__school.teacher_list.append(self)

    def tch_teaching(self):
        print '''\
        name : %s
        age  : %s
        sex  : %s
        doing: %s
        ''' % (self.name, self.age, self.sex, 'teach...')

    # 老师转校同步到学校
    def tec_transfer(self):
        """Teacher transfer to other school."""
        self.__school.teacher_list.remove(self)

def formated_show(header, cur_list):
    """Formated show students/teachers info.

    Args:
        header  : print header info
        cur_list: student/teacher list
    """
    print '==> %s' % (header)
    for cur_item in cur_list:
        last_attr = getattr(cur_item, 'grade', None) or getattr(cur_item,
                                                                'salary',
                                                                None)
        print (getattr(cur_item, 'name', None),
               getattr(cur_item, 'age', None),
               getattr(cur_item, 'sex', None), last_attr)

if __name__ == '__main__':
    # 学生注册
    cur_school = School()
    for i in xrange(2):
        name = 'user_%s' % i
        age = 20 + i
        sex = random.choice(('Man', 'Woman'))
        grade = random.randint(60, 100)
        Student(name, age, sex, cur_school ,grade)
        Teacher(name, age, sex, cur_school ,10000)

    # 当前人数
    formated_show('Student', cur_school.student_list)
    formated_show('Teacher', cur_school.teacher_list)

    # 学生转校
    cur_school.student_list[0].stu_transfer()
    # 老师转校
    cur_school.teacher_list[0].tec_transfer()

    # 转校后的
    formated_show('Student', cur_school.student_list)
    formated_show('Teacher', cur_school.teacher_list)


你可能感兴趣的:(面向对象.类的继承)