类的继承

类的继承

引题:生活例子。手机类,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不支持。
优点:方便调用父类中的东西;代码复用;父类名变化时子类不用过多修改,好维护。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值