类的继承
引题:生活例子。手机类,oppo手机类、华为类手机看做是手机类里的对象;但oppo手机也可以称作一个类,这个类下又包含find系列、R系列类,R系列类又包含某某具体型号对象。类有包含、继承的关系。
引题2:写一个教师类:属性name age sex salary subject address phone,方法say_hi(), go_work()。
再写一个学生类:属性name age sex hobby parent_info,方法say_hi(), go_class()。
再写行政人员类
class Teacher():
def __init__(self, name, age, sex, salary, subject, address):
self.name = name
self.age = age
self.sex = sex
self.salary = salary
self.subject = subject
self.address = address
def say_hi(self):
print('hello')
def go_work(self):
pass
class Student():
def __init__(self, name, age, sex, hobby, parent_info):
self.name = name
self.age = age
self.sex = sex
self.hobby = hobby
self.parent_info = parent_info
def say_hi(self):
print('hello')
def go_class(self):
pass
上面的代码类与相似的类有重复的属性、方法,书写麻烦。
所以python引入了类继承机制。继承是类的三大特性之一。
继承
class Animal(object):
def __init__(self, name):
self.name = name
def run(self):
print('动物在跑')
class Dog(Animal):
pass
class Cat(Animal):
pass
dog1 = Dog('阿拉斯加')
dog1.run()
cat1 = Cat('波斯猫')
cat1.run()
父类子类:上例中 Animal类逻辑上、范围上包含Dog、Cat类。那么我们把Animal类叫做
“父类”、“超类”、“基类”;Dog、Cat类就叫做“子类”、“衍生类”
继承inherit:语法 类定义时,类名后面小括号里填写父类名。 注意跟类实例化时、函数后面的小括号里的内容不一样。
object: python中变量、方法万物皆对象,现实生活中也是万物皆对象。为了面向对象体系完整,定义了一个默认的、抽象的顶级对象object。object是所有类的父类。每一个类都默认继承object类,具备一些关于类的基础方法如__init__ del。
子类继承父类所有的属性、方法: Dog类实例化用的是父类Animal类中的__init__() run()。例如华为手机类拥有的父类手机类打电话、发短信功能。
场景:类比较多而且相似的时候,适合抽象为父类、子类,比如游戏。过度抽象可能会使问题更加复杂,不要刻意去使用父子类。
好处:类与类关系更加清晰;代码量少;公共部分抽象出来,扩展更方便。
重写
引题:上面例子展示了子类继承父类,子类可以继承父类的属性和方法。但是生活中往往子类除了具备一些父类的特征,还具备自己个性化的特征。例如父类 手机类,子类oppo手机类 独特特征拍照,苹果手机类 系统好。
class Animal(object):
def __init__(self, name):
self.name = name
def run(self):
print('动物在跑')
class Dog(Animal):
def swim(self):
print('狗会游泳')
class Cat(Animal):
def crawl_tree(self):
print('猫会爬树')
def run(self):
print('猫灵活地跑')
dog1 = Dog('泰迪犬')
dog1.run()
dog1.swim()
cat1 = Cat('布偶猫')
cat1.run()
cat1.crawl_tree()
子类个性化:只要在子类当中书写个性化属性和方法。
重写overrides:比如一个父类Animal下有二十个子类Dog、Cat…,这些动物都有run方法,所以公共run方法应该写在Animal类中,但是个别子类run姿势奇特想个性化定义,那么在子类中实现run方法。
子类和父类中出现同名方法,叫做重写。子类中的方法覆盖父类中的同名方法,子类方法生效。
super()
继承 > 重写 > super() (了解)
引题1:比如一个计算机系有 电商方向、软件方向,它们的课程70%一样(数学英语C语言),其它30%不一样(电商seo优化、软件方向xx编程框架),子类跟父类方法部分相同。而上节课的例子run方法是子类完全重写覆盖父类方法。
引题2:5类的继承.py一节中的学生、老师类例子用继承方式写出来
class People(object):
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
def say_hi(self):
print('hello')
def work(self, time):
if time <= 8:
print('正常上班')
elif time > 8:
print('加班时间')
class Student(People):
def __init__(self, name, age, sex):
# self.name = name
# self.age = age
# self.sex = sex
super()
def work(self, time):
print('学生不用工作')
class Teacher(People):
def __init__(self, name, age, sex, salary, class_num):
# 1>一个一个属性写构造函数
# self.name = name
# self.age = age
# self.sex = sex
# 2> 类名.方法名
# People.__init__(name, age, sex)
# 3> super(子类名,子类实例)
# super(Teacher, self).__init__(name, age, sex)
# 4> 省略参数的super()
super().__init__(name, age, sex)
self.salary = salary
self.class_num = class_num
def work(self, time):
print('先看看新闻')
super().work(time=8)
print('吃完饭')
stu1 = Student('小明', 10, 'male')
stu1.say_hi()
stu1.work(time=8)
tea1 = Teacher('杨老师', 28, 'male', 10000, 314)
tea1.say_hi()
完全重写:子类重写父类方法,完全覆盖父类方法内容。例如上一节例子,Cat类的run()方法完全替代了父类Animal类中的run()的内容。
部分重写: 子类重写父类方法,继承父类方法中一部分内容,又有个性化部分。
super(): 调用父类。重用父类属性、方法,减少了代码量。
专为继承设计。子类调用完父类相同之处后,个性化的东西可以另外写。
语法:原始语法super(子类名,子类实例) ,省略参数super() py2不支持。
优点:方便调用父类中的东西;代码复用;父类名变化时子类不用过多修改,好维护。