面向对象—继承(Day19)
初识继承
继承是一种创建新类的方式,在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)的更多相关文章
- OC面向对象—继承
OC面向对象—继承 一.基本概念 程序的世界和人类的“对象”世界在思想上是没有设么区别的,富二代继承了父母,自然就拥有了父母拥有的所有资源,子类继承了父类同样就拥有了父类所有的方法和属性(成员变量). ...
- 面向对象继承实例(a如何继承b)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- js面向对象继承
前言 最近看到js面向对象这章节了,主要学习了原型和面向对象继承关系,为了梳理自己的知识逻辑,特此记录. js的面向对象 先说说我目前了解的js创建对象方法 1.写一个函数,然后通过new创建对象 2 ...
- Php面向对象 – 继承和重写
Php面向对象 – 继承和重写 承受: php于,通过类.使用特殊的经营宗旨. 通过定义类,采用extends来表示当前的类对象继承该类的对象. 样例: class C { public $p_c ...
- Java面向对象 继承(下)
Java面向对象 继承(下) 知识概要: (1)抽象类 1.1 抽象类概述 1.2 抽象类的特点 ...
- Java面向对象 继承(上)
Java面向对象 继承 知识概要: (1)继承的概述 (2)继承的特点 (3)super关键字 (4)函数覆盖 (5) 子类的实例化过程 (6) final关键字 (1)继承 ...
- js高级-面向对象继承
一.工厂模式创建对象及优缺点 继承就是把公共的部分抽象出来作为父类,基类.吃饭,跑步等 var a = {}; //批量创建不方便,不能重复设置公共属性的代码 //工厂模式出现了,创建10个Cat对象 ...
- 面向对象 继承 抽象类 接口 static 权限修饰符
Day01 面向对象 继承 抽象类 接口 static 1.匿名对象是指创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量. 2.类的继承是指在一个现有类的基础上去构建一个新的类,构建出 ...
- Python之面向对象继承和派生
Python之面向对象继承和派生 什么是继承: 继承是一种创建新的类的方法.在Python中,新建的类可以继承自一个或多个父类.原始类称为基类或超类. 新建的类称为派生类或子类. Python中类的继 ...
- javaScript面向对象继承方法经典实现
转自原文javaScript面向对象继承方法经典实现 JavaScript的出现已经将近20多年了,但是对这个预言的褒贬还是众说纷纭.很多人都说JavaScript不能算是面向对象的变成语言.但是Ja ...
随机推荐
- 嫌Excel VBA执行速度慢,这些建议你一定要看
Excel是办公利器,这无需多言.尤其在办公室,Excel用的熟练与否,会的Excel知识点多不多,很大程度上决定了你工作是否高效,能否按时打卡下班.可我们也时常听到这样的吐槽:Excel好是好,可就 ...
- day 12 default后面是否还可以跟case
(1).有以下程序: #include<stdio.h> void main(){ int case,float printF; printf("输入2个数\n"): ...
- Solon 开发,二、注入或手动获取Bean
Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...
- Java中的常用类——Arrays
数组工具类java.util.Arrays Arrays类中的方法都是static修饰的静态方法,因此可以直接使用类名.方法名来调用,而不用通过new使用对象来调用(是"不用"不是 ...
- 记录一个问题:macos High Sierra 10.13.6 内核内存泄漏,导致内存满而不得不重启
kernel_task进程占用内存10g以上,使用中突然提示内存不足,要求杀死工作进程,不得不强按电源键来关机重启. 升级之前,版本大约是macos High Sierra 10.13.4, 系统频繁 ...
- 论文解读《The Emerging Field of Signal Processing on Graphs》
感悟 看完图卷积一代.二代,深感图卷积的强大,刚开始接触图卷积的时候完全不懂为什么要使用拉普拉斯矩阵( $L=D-W$),主要是其背后的物理意义.通过借鉴前辈们的论文.博客.评论逐渐对图卷积有了一定的 ...
- 《手把手教你》系列技巧篇(六十)-java+ selenium自动化测试 - 截图三剑客 -中篇(详细教程)
1.简介 前面我们介绍了Selenium中TakeScreenshot类来截图,得到的图片是浏览器窗口内的截图.有时候,只截浏览器窗口内的图是不够的,而且TakeScreenshot截图只针对浏览器的 ...
- gin框架使用Air实时加载
Air实时加载 本章我们要介绍一个神器--Air能够实时监听项目的代码文件,在代码发生变更之后自动重新编译并执行,大大提高gin框架项目的开发效率. 1.1.1. 为什么需要实时加载? 之前使用Pyt ...
- One Switch
前言 One Switch 是由国内知名开发者 TualatriX 带来的最新作品,功能小巧精简,设计优雅,犹如一块多功能的遥控器,通过状态栏快捷菜单即可「一键」快速实现保持亮屏.切换 AirPods ...
- 使用 Kubeadm+Containerd 部署一个 Kubernetes 集群
本文独立博客阅读地址:https://ryan4yin.space/posts/kubernetes-deployemnt-using-kubeadm/ 本文由个人笔记 ryan4yin/knowle ...