zoukankan      html  css  js  c++  java
  • python面向对象三大特性之继承

    继承是创建新类的方法,以下是几个概念

    父类,基类,超类: 被继承的类

    子类,派生类:继承而产出的类

    单继承:继承一个父类

    多继承:继承多个父类

    • 继承: 什么是什么的关系
    • 父类中没有的属性,在字类中出现就叫派生方法
    • 如果字类中有的方法,就用子类的,如果没有就用父类的,如果父类也没有,就报错  子类---父类
    • 如果子类和父类都有的方法,但还需要调用父类的方法,就需要单独调用父类的方法
    class ParentClass1:
        pass
    
    class ParentClass2:
        pass
    
    
    class Sonclass1(ParentClass1): # Sonclass1 类继承了ParentClass1类 为单继承
        pass
    
    class  Sonclass2(ParentClass1,ParentClass2): # Sonclass2继承了ParentClass1和ParentClass2 为多继承(Python独有)
        pass
    
    # 通过__bases__方法,查看类的继承情况
    print(Sonclass1.__bases__)
    print(Sonclass2.__bases__)
    print(ParentClass1.__bases__)
    print(ParentClass2.__bases__)
    
    # (<class '__main__.ParentClass1'>,) # 确认为单继承
    # (<class '__main__.ParentClass1'>, <class  '__main__.ParentClass2'>) # 确认为多继承
    # (<class 'object'>,) # 如果没有继承,默认继承object类
    # (<class 'object'>,)# 如果没有继承,默认继承object类

    重用性

    当抽象出相同的属性或方法后,可以找到一个被继承类

    例子1

    # 如下代码段定义了两个类,一个是老师类,一个是学生类
    # 老师和学生类都有名字,性别,年龄等属性,也都有吃的技能,代码重复性高
    # 所不同的是老师会教的技能,学生有学的技能
    
    class Teacher:
        def __init__(self,name,age,sex):
            self.name = name
            self.age = age
            self.sex = sex 
        
        def eat(self):
            print('%s is eating'%self.name)
        
        def teach(self):
            print('%s is teaching'%self.name)
            
            
    class Student:
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
    
        def eat(self):
            print('%s is eating' % self.name)
            
        def study(self):
            print('%s is studying'%self.name)
    # 因为老师和学生都是人类,都有名字,姓名,性别属性,也有吃的技能,所以抽象出一个父类,将这些重复性的属性和方法定义,并在子类里继承父类的属性和功能
    
    class Person:
        def __init__(self,name,age,sex):
            self.name = name
            self.age = age
            self.sex = sex
    
        def eat(self):
            print('%s is eating'%self.name)
    
    class Teacher(Person):
    
        def teach(self):
            print('%s is teaching'%self.name)
    
    class Student(Person):
    
        def study(self):
            print('%s is studying'%self.name)

    派生

    当然子类也可以添加自己新的属性或者在自己这里重新定义这些属性(不会影响到父类),需要注意的是,一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己为准了

    # 下述代码中定义了一个人类和狗类,都有姓名和年龄属性,
    # 不同的是人类有性别属性,动物有品种属性
    # 那么怎么解决姓名和年龄的代码重复呢
    class  Person:
        def __init__(self,name,age,sex):
            self.name = name
            self.age = age
            self.sex = sex 
            
    class Dog:
        def __init__(self,name,age,kind):
            self.name = name
            self.age = age
            self.kind = kind

    # 将人和狗类进一步抽象出一个动物类,有名字,姓名的属性,在实例化对象时

    Animal.__init__(self,name,age)  父类.__init(self,参数)传入共有的参数
    class Animal:
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
    class  Person(Animal):
        def __init__(self,name,age,sex):
            Animal.__init__(self,name,age)
            self.sex = sex  # 派生属性
    
    class Dog(Animal):
        def __init__(self,name,age,kind):
            Animal.__init__(self,name,age)
            self.kind = kind # 派生属性
    
    wangys = Person('wangys',18,'')
    print(wangys.name)

    如果既想使用父类的方法,又想使用子类的方法,需要将父类单独执行

    class  Dog():
        def __init__(self,name,hp,aggr,kind):
            self.name = name
            self.hp = hp
            self.aggr = aggr
            self.kind = kind
    
        def eat(self):
            self.hp +=100
            print('吃药回血')
            print('%s汪汪叫'%self.name)
    
    d = Dog('d',100,10,'tady')
    d.eat()
    print(d.hp)

    class
    Animal: def __init__(self,name,hp,aggr): self.name = name self.hp = hp self.aggr = aggr def eat(self): self.hp +=100 print('吃药回血') class Dog(Animal): def __init__(self,name,hp,aggr,kind): Animal.__init__(self,name,hp,aggr) self.kind = kind def eat(self): Animal.eat(self) print('%s汪汪叫'%self.name) d = Dog('d',100,10,'tady') d.eat() print(d.hp)

    可以使用super

    class Animal:
        def __init__(self,name,hp,aggr):
            self.name = name
            self.hp = hp
            self.aggr = aggr
    
        def eat(self):
            self.hp +=100
            print('吃药回血')
    
    
    
    class  Dog(Animal):
        def __init__(self,name,hp,aggr,kind):
            super().__init__(name,hp,aggr) 
            self.kind = kind
    
        def eat(self):
            super().eat()
            print('%s汪汪叫'%self.name)
    
    d = Dog('d',100,10,'tady')
    d.eat()
    print(d.hp)

    多继承

  • 相关阅读:
    PAT 甲级 1041 Be Unique (20 分)(简单,一遍过)
    [精]Odoo 8.0深入浅出开发教程-模块开发基础
    iOS开发- UILabel 自己主动换行 及 高度自适应
    Android
    权限管理表结构设计
    创建SQL语句_面试
    Hasen的linux设备驱动开发学习之旅--时钟
    关于源程序到可运行程序的过程
    微信服务号 微信支付开发
    MongoDB基础入门视频教程
  • 原文地址:https://www.cnblogs.com/wc89/p/10363817.html
Copyright © 2011-2022 走看看