day24 面向对象-继承

什么是继承

继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类

继承是类中提供的一种新语法面向对象三大特性:封装 继承 多态继承:什么是什么的关系    他大舅打二舅都是他舅    高桌子低板凳都是木头

继承语法,单继承和多继承

class ParentClass1: #定义父类
    pass

class ParentClass2: #定义父类
    pass

class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
    pass

class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
    pass

查看继承__bases__

类名.__bases__
>>> SubClass1.__bases__ #__base__只查看从左到右继承的第一个子类,__bases__则是查看所有继承的父类
(<class ‘__main__.ParentClass1‘>,)
>>> SubClass2.__bases__
(<class ‘__main__.ParentClass1‘>, <class ‘__main__.ParentClass2‘>)

提示:如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现。

继承与抽象(先抽象,再继承)

抽象即抽取类似或者说比较像的部分。

抽象分成两个层次: 

1.将奥巴马和梅西这俩对象比较像的部分抽取成类;

2.将人,猪,狗这三个类比较像的部分抽取成父类。

抽象最主要的作用是划分类别(可以隔离关注点,降低复杂度)

继承:是基于抽象的结果,通过编程语言去实现它,肯定是先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构。

抽象只是分析和设计的过程中,一个动作或者说一种技巧,通过抽象可以得到类

 继承与重用性

#狗
class Dog:
    def eat(self):
        print(‘eating‘)

    def drink(self):
        print(‘drinking‘)

    def sleep(self):
        print(‘sleeping‘)

    def say(self):
        print(‘汪汪汪‘)

#猫
class Cat:
    def eat(self):
        print(‘eating‘)

    def drink(self):
        print(‘drinking‘)

    def sleep(self):
        print(‘sleeping‘)

    def say(self):
        print(‘喵喵喵‘)

#狗类和猫类都有 eat,drink,sleep 的方法,所有写一个父类,让子类继承父类的这些方法

class Animal:        #父类、超类
    def eat(self):
        pass
    def drink(self):
        pass
    def sleep(self):
        pass

class Dog(Animal):   #子类、派生类  子类继承父类的方法和属性
    pass
class Cat(Animal):   #子类、派生类
    pass

dog = Dog()
cat = Cat()
dog.eat()
dog.drink()
dog.say()   #汪汪汪
cat.eat()
cat.drink()
cat.say()   #喵喵喵

print(Dog.__bases__)

使用继承来解决代码重用的例子

在开发程序的过程中,如果我们定义了一个类A,然后又想新建立另外一个类B,但是类B的大部分内容与类A的相同时

我们不可能从头开始写一个类B,这就用到了类的继承的概念。

通过继承的方式新建类B,让B继承A,B会‘遗传’A的所有属性(数据属性和函数属性),实现代码重用

class Animal:
    ‘‘‘
    人和狗都是动物,所以创造一个Animal基类
    ‘‘‘
    def __init__(self, name, aggressivity, life_value):
        self.name = name  # 人和狗都有自己的昵称;
        self.aggressivity = aggressivity  # 人和狗都有自己的攻击力;
        self.life_value = life_value  # 人和狗都有自己的生命值;

    def eat(self):
        print(‘%s is eating‘%self.name)

class Dog(Animal):
    pass

class Person(Animal):
    pass

egg = Person(‘egon‘,10,1000)
ha2 = Dog(‘二愣子‘,50,1000)
egg.eat()
ha2.eat()

 

 派生

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

在继承中子类可以继承父类的所有属性和方法但是 当父类和子类中有同名方法的时候 一定调用子类的如果想使用父类该方法的功能 需要借助super方法

super

子类中执行父类的方法super()

class A:
    def hahaha(self):
        print(‘A‘)

class B(A):
    def hahaha(self):
        super().hahaha()  #调用父类中的hahaha()方法
        #super(B,self).hahaha()
        #A.hahaha(self)
        print(‘B‘)

a = A()
b = B()
b.hahaha()  #A B
super(B,b).hahaha() #A

实例一

class Animal:
    def __init__(self,name,food):
        self.name = name
        self.food = food
    def eat(self):
        print(‘%s吃%s‘%(self.name,self.food))
    def drink(self):
        print(‘%s喝水‘%self.name)

class Dog(Animal):
    def __init__(self,name):    #子类对象初始化   实例化时只接受一个参数
        super().__init__(name,‘狗粮‘) #调用父类的__init__方法,需要传入两个参数  狗类的food就是狗粮
    def swim(self):
        print(‘在游泳‘)
class Bird(Animal):
    def __init__(self,name):
        super().__init__(name,‘虫子‘)
    def fiy(self):
        print(‘%s在飞‘%self.name)

gou = Dog(‘旺财‘)
gou.eat()
gou.drink()

niao = Bird(‘布谷鸟‘)
niao.fiy()
niao.eat()
niao.drink()

实例二

class Animal:   #定义父类
    def __init__(self,name,blood,aggr):
        self.name =name
        self.blood = blood
        self.aggr = aggr
class Person(Animal):   #继承父类Animal
    def __init__(self,name,blood,aggr,money):   #实例化一个人类时,要传入4个参数
        super().__init__(name,blood,aggr)   #共有的属性调用父类的__init__方法,传入父类__init__要传的参数
        self.money = money  #子类独有的属性
    def attack(self,dog):
        dog.blood -= self.aggr

class Dog(Animal):  #继承父类Animal

    def bite(self,person):
        person.blood -= self.aggr

alex = Person(‘alex‘,2000,100,100000)
print(alex.money)   #100000

通过继承建立了派生类与基类之间的关系,它是一种‘是‘的关系,比如白马是马,人是动物。

当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好,比如教授是老师

>>> class Teacher:
...     def __init__(self,name,gender):
...         self.name=name
...         self.gender=gender
...     def teach(self):
...         print(‘teaching‘)
...
>>>
>>> class Professor(Teacher):
...     pass
...
>>> p1=Professor(‘egon‘,‘male‘)
>>> p1.teach()
teaching
时间: 2024-10-13 17:46:00

day24 面向对象-继承的相关文章

(一)关于面向对象----继承

(一)关于面向对象----继承 接触面向对象许久了,对于继承这一块也确实琢磨了一段时间,搜集各种资料和网站,也未能得到使自己满意的,并能快速理解的继承知识,于是对他们归类,并得出自己的总结. 先说说继承是什么吧?也许我们最早接触有关继承的应该是"遗产"??也许电视剧看多了,总有家族为了这玩意儿整的你死我活,确实听看不下去的哈,但是对于咱大JS而言,可就变得十分和蔼,可亲.毕竟没有人来争夺,也不会有任何事故,最多来些许bug等等.废话不多说,进入正题!! 1.扩展原型对象继承:往原型对象

Php面向对象 – 继承和重写

继承: php中,通过在类上,使用特殊的操作达到目的. 通过在定义类时,利用extends来指明当前类对象继承那个类的对象. 例子: class C { public  $p_c =  "value c"; } class D extends C { public  $p_d = "value d"; } $o =  new D; var_dump($o->p_c) var_dump($o->p_d) 输出:string(7) "value c

Java面向对象㈡ -- 继承与多态

Java的继承是通过extends和implement来实现的,Java不支持多继承,但是Java支持多层继承以及多实现(接口).Java继承有一个关键字super是用来指向父类.Java继承衍生出覆盖的概念.覆盖被用来支持多态.实际开发中Java通常继承于抽象类,实现于接口.如果不希望一个类被继承,或者一个方法被覆盖,或者一个成员变量被改变,就可以用final修饰.这里只说明两个问题:1,重载和覆盖的区别重载和覆盖的区别:重载发生在同一个类之中,重载要求函数名相同,参数不同(参数个数||参数类

关于 JS 面向对象继承属性和方法的小例子

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h1>关于 JS 面向对象继承属性和方法的小例子</h1> </body> </html> <script> //人的构造函

黑马程序员-OC面向对象继承关系和组合关系笔记

继承关系是描述类和类之间的关系,两个类分别称为子类和父类,子类继承了父类,子类就拥有了父类的属性和方法: 继承的关系特点描述出来就是:** "是" **  (例如:学生类 是 人类) 组合关系描述的语句是:**** "拥有" ***  (例如:学生有成绩这个属性,而成绩属性本来就是一个成绩类的对象 ) 继承示例代码: #import <Foundation/Foundation.h> //Animal类的声明 @interface Animal : NS

12.面向对象(继承/super/接口/抽象类)

面向对象继承与派生继承继承顺序继承原理子类调用父类的方法(super)组合接口接口的概念:接口的概念解释和使用:python中的接口:抽象类 面向对象 继承与派生 继承 什么是继承?继承是一种创建新的类的方式 class A: pass class B(A): pass 在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或者超类,新建的类称为派生类或者子类 python中类的继承分为,单继承和多继承. 查看继承的方法B.__bases__ 如果没有指定基类,python的类会默

C#编程语言与面向对象——继承

现实生活中的事物都归属于一定的类别,比如,狮子是一种(IS_A)动物,为了在计算机中模拟这种关系,面向对象的语言引入了继承(inherit)特性. 构成继承关系的两个类中,Animal称为父类(parent class)或基类(base class),Lion称为子类(child class). 父类与子类之间拥有以下两个基本特性: 1.是一种(IS_A)关系:子类是父类的一种特例. 2.扩充(Extends)关系:子类拥有父类所没有的功能. class Animal { } class Lio

.Net学习 第2季02 C#面向对象继承1

.Net 视频学习第2季 C#面向对象 面向对象继承1 查找类的命名空间快捷键:alt+shift+F10 项目A中有类X,要在项目B中使用X的话,首先在项目B的引用当中添加项目A,然后在项目B的代码中添加using A;(假设项目A类X的命名空间就是A)或者在使用X时采用A.X的格式. 记录运行时间 Stopwatch sw = new Stopwatch(); sw.Start(); // 代码 sw.Stop(); Console.WriteLine(sw.Elapsed); Start(

js面向对象继承

前言 最近看到js面向对象这章节了,主要学习了原型和面向对象继承关系,为了梳理自己的知识逻辑,特此记录. js的面向对象 先说说我目前了解的js创建对象方法 1.写一个函数,然后通过new创建对象 2.字面量的方式 如果想要复用的话,可能会用到工厂方法 工厂方法每次都要创建对象 并返回 构造方法创建对象方法可以更简洁 然而构造方法用实现实例间共享共同的方法,比较麻烦 原型可以实现实例共享所有属性 每个函数都有指向原型对象的指针,如果将一个函数的原型属性赋值给另外函数的实例,函数的原型将指向另外一