初识继承

继承是一种创建新类的方式,在python中新类可以继承一个或多个父类,父类又可称为基类或超类,新建的类为派生类或子类。(类与类之间的关系是什么是什么的关系。)

继承语法:

class Parent:pass
class Son(Parent):pass #Son继承了Parent
print(Son.__bases__) #(<class '__main__.Parent'>,)
print(Parent.__bases__) #(<class 'object'>,)

内置属性:__bases__用来查看当前类的父类是谁

在python3中所有的类都会默认继承object类,继承了object类的所有类都是新式类,如果一个类没有继承任何父类,那么__bases__属性就会显示(<class 'object'>,)。

继承分为单继承和多继承:

单继承:继承一个父类,所有面向对象语言都有单继承的特点。

多继承:可以继承多个父类。

class Parent1:pass
class Parent2:pass
class Parent3:pass
class Son(Parent1,Parent2,Parent3):pass #Son继承了多个父类
print(Son.__bases__) #(<class '__main__.Parent1'>, <class '__main__.Parent2'>, <class '__main__.Parent3'>)

实例:

class Animal:#定义一个父类
def __init__(self,name,hp,ad): # 共有的属性
self.name = name
self.hp = hp
self.ad = ad class Person(Animal): #定义一个子类,继承父类
pass
class Dog(Animal):#定义一个子类,继承父类
pass alex = Person('alex',10,20)
teddy = Dog('teddy',50,60)
print(alex.__dict__)
print(teddy.__dict__)

派生:子类可以添加自己新的属性,或者在自己这里重新定义这些属性,一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己的为准。

class Animal:#定义一个父类
def __init__(self,name,hp,ad): # 共有的属性
self.name = name
self.hp = hp
self.ad = ad class Person(Animal): #定义一个子类,继承父类
def attack(self,dog): #子类自己的属性,派生方法
print('%s攻击了%s' % (self.name,dog.name))
class Dog(Animal):#定义一个子类,继承父类
def bite(self,person): #子类自己的属性,派生方法
print('%s咬了%s' % (self.name,person.name)) alex = Person('alex',10,20)
teddy = Dog('teddy',50,60)
alex.attack(teddy) #alex攻击了teddy
teddy.bite(alex) # ddy咬了alex
class Animal:#定义一个父类
def __init__(self,name,hp,ad): # 共有的属性
self.name = name
self.hp = hp
self.ad = ad
def eat(self):
print('%s吃药回血了' %self.name) class Person(Animal): #定义一个子类,继承父类
def attack(self,dog): #子类自己的属性,派生方法
print('%s攻击了%s' % (self.name,dog.name))
def eat2(self):
print('执行了person类的eat方法')
self.money = 100
self.money -= 10
self.hp += 10
class Dog(Animal):#定义一个子类,继承父类
def bite(self,person): #子类自己的属性,派生方法
print('%s咬了%s' % (self.name,person.name)) alex = Person('alex',10,20)
teddy = Dog('teddy',50,60)
teddy.eat() #teddy吃药回血了
alex.eat2()
alex.eat() #alex吃药回血了

alex.eat = '123'
print(alex.eat())#对象自己内存空间里有了eat,不找类及父类中的

对象使用名字的顺序:先找对象自己内存空间里的,再找对象自己类内存空间里的,再找父类例的。

self.名字的时候,不要看self当前在哪个类里,要看这个self到底是谁的对象。

class Parent:
def func(self):
print('in parent func')
def __init__(self):
self.func() class Son(Parent):
def func(self):
print('in son func')
s = Son() #in son func

 object类:新式类默认继承object

 继承与派生

1.在类中增加派生属性的方法:

父类名.__init__(属性名),

super(类名,self).__init__(属性名,不加self),可以简化成super()..__init__(属性名,不加self),在单继承中,super负责找到当前类所在的父类,在这个时候不需要再手动传self。

2.调用派生方法时子类中有找子类的,子类中没有找父类的,子类中有但是想要找父类中的有两种方法:

1)父类名.方法名(子类对象)

2)super(子类名,子类对象).方法() 这种方法一般不用,一般在子类内用super()

class Animal:
def __init__(self,name,hp,ad):
self.name = name # 对象属性 属性
self.hp = hp #血量
self.ad = ad #攻击力
def eat(self):
print('eating in Animal') class Person(Animal):
def __init__(self,name,hp,ad,sex):
# Animal.__init__(self,name,hp,ad)
super().__init__(name,hp,ad) # super(Person,self).__init__(name,hp,ad)
self.sex = sex # 派生属性
def attack(self,dog): # 派生方法
print("%s攻击了%s"%(self.name,dog.name))
def eat(self):
super().eat() #找父类里的方法
print('eating in Person') class Dog(Animal):
def __init__(self,name,hp,ad,kind):
Animal.__init__(self,name,hp,ad)# 类名.方法名
self.kind = kind
def bite(self,person): # 派生方法
print("%s咬了%s" % (self.name, person.name)) # 人 sex
alex = Person('alex',100,10,'female') # 实例化
teddy = Dog('tom',200,50,'泰迪')
print(alex.__dict__)
print(teddy.__dict__)
Animal.eat(alex)#指名道姓法
super(Person,alex).eat()
alex.eat()

钻石继承

新式类多继承顺序:广度优先的算法,保证每个类都能找一遍

class A:
def func(self):
print('A')
class B(A):
def func(self):
print('B')
class C(A):
def func(self):
print('C')
class D(B,C):
def func(self):
print('D') d = D()
d.func()

super在单继承中就是单纯的寻找父类

在多继承中就是根据当前模型所在的位置按照广度优先的算法找下一个类。

经典类多继承顺序:深度优先算法

经典类:在python2x版本中存在,且不继承object类,遍历时遵循深度优先的算法,没有mro方法,没有super方法。

新式类:python3x版本中只有新式类,python2x版本中需要继承object的才是新式类,遍历时遵循广度优先的算法,有super方法,但是在2.X版本的解释器中,必须传参数(子类名,子类对象),有mro方法。

面向对象—继承(Day19)的更多相关文章

  1. OC面向对象—继承

    OC面向对象—继承 一.基本概念 程序的世界和人类的“对象”世界在思想上是没有设么区别的,富二代继承了父母,自然就拥有了父母拥有的所有资源,子类继承了父类同样就拥有了父类所有的方法和属性(成员变量). ...

  2. 面向对象继承实例(a如何继承b)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. js面向对象继承

    前言 最近看到js面向对象这章节了,主要学习了原型和面向对象继承关系,为了梳理自己的知识逻辑,特此记录. js的面向对象 先说说我目前了解的js创建对象方法 1.写一个函数,然后通过new创建对象 2 ...

  4. Php面向对象 – 继承和重写

    Php面向对象 – 继承和重写 承受: php于,通过类.使用特殊的经营宗旨. 通过定义类,采用extends来表示当前的类对象继承该类的对象. 样例: class C { public  $p_c  ...

  5. Java面向对象 继承(下)

     Java面向对象   继承(下) 知识概要:               (1)抽象类 1.1 抽象类概述                            1.2 抽象类的特点       ...

  6. Java面向对象 继承(上)

       Java面向对象 继承 知识概要:         (1)继承的概述 (2)继承的特点 (3)super关键字 (4)函数覆盖 (5) 子类的实例化过程 (6) final关键字 (1)继承 ...

  7. js高级-面向对象继承

    一.工厂模式创建对象及优缺点 继承就是把公共的部分抽象出来作为父类,基类.吃饭,跑步等 var a = {}; //批量创建不方便,不能重复设置公共属性的代码 //工厂模式出现了,创建10个Cat对象 ...

  8. 面向对象 继承 抽象类 接口 static 权限修饰符

    Day01 面向对象 继承 抽象类 接口 static 1.匿名对象是指创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量. 2.类的继承是指在一个现有类的基础上去构建一个新的类,构建出 ...

  9. Python之面向对象继承和派生

    Python之面向对象继承和派生 什么是继承: 继承是一种创建新的类的方法.在Python中,新建的类可以继承自一个或多个父类.原始类称为基类或超类. 新建的类称为派生类或子类. Python中类的继 ...

  10. javaScript面向对象继承方法经典实现

    转自原文javaScript面向对象继承方法经典实现 JavaScript的出现已经将近20多年了,但是对这个预言的褒贬还是众说纷纭.很多人都说JavaScript不能算是面向对象的变成语言.但是Ja ...

随机推荐

  1. Keepalived高可用、四层负载均衡

    目录 Keepalived高可用 高可用简介 常用的工具 问题 名称解释 VRRP协议 部署keepalived 下载安装 Keepalived配置 保证nginx配置一样 解决keepalived的 ...

  2. vivo推送平台架构演进

    本文根据Li Qingxin老师在"2021 vivo开发者大会"现场演讲内容整理而成.公众号回复[2021VDC]获取互联网技术分会场议题相关资料. 一.vivo推送平台介绍 1 ...

  3. 《剑指offer》面试题34. 二叉树中和为某一值的路径

    问题描述 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 示例: 给定如下二叉树,以及目标和 sum = 22, 5 ...

  4. dubbo泛化引发的生产故障之dubbo隐藏的坑

    dubbo泛化引发的生产故障之dubbo隐藏的坑 上个月公司zk集群发生了一次故障,然后要求所有项目组自检有无使用Dubbo编程式/泛化调用,强制使用@Reference生成Consumer.具体原因 ...

  5. 简述ASP.NET网站开发步骤

    新建解决方案 清除解决方案 重新生成解决方案 发布应用程序 设置配置文件 重命名配置文件 发布后生成的文件 IIS安装 安装完成后,输入http://localhost/出现 打开IIS 添加自己的网 ...

  6. 【记录一个问题】golangci-lint.exe中,盘符大写就会执行出错

    golangci-lint.exe版本为1.31.0 执行:golangci-lint.exe run d:\source\github.com\ahfuzhang\go_xxx_server\src ...

  7. gorm中的高级查询

    智能选择字段 GORM 允许通过 Select 方法选择特定的字段,如果您在应用程序中经常使用此功能,你也可以定义一个较小的结构体,以实现调用 API 时自动选择特定的字段,例如: type User ...

  8. 使用MobaXterm发布服务器项目文件

    注:笔记旨在记录 目录 一.使用MobaXterm登录服务器 二.后端发布 三.前端发布 一.使用MobaXterm登录服务器 打开MobaXterm,点击左上角Session->SSH,输入账 ...

  9. JavaWeb概念及Web资源的分类

    一,JavaWeb概念 1,JavaWeb,所有通过java语言编写可以通过浏览器访问的程序的总称 JavaWeb是基于请求和响应来开发的. 2,什么是请求 请求:指客户端给服务端发送数据,Reque ...

  10. Android Native -- Message/Handler/Looper机制(应用篇)

    ⌈Android Native消息队列处理系列文章⌋ Android Native -- Message/Handler/Looper机制(原理篇) Android Native -- Message ...