初识继承

继承是一种创建新类的方式,在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. vue3.0+vite+ts项目搭建--基础配置(二)

    集成vue-router 使用yarn yarn add vue-router@next --save 安装完成之后在src目录下创建文件夹router/index.ts,创建完成之后需要在Vue-R ...

  2. 微信小程序输入框上移问题解决

    微信小程序的输入框在上面还好,如果不是,在聚焦的时候页面就会上移,上方的页面信息会看不到,影响用户操作 在这里可以手动设置并获取输入框的高度来解决 这种方式虽然有的机子有点卡,但是已经算是比较完美的解 ...

  3. Rust学习(一)

    为什么学习Rust 最近在看Linux相关新闻的时候,看到了Linux内核正在将Rust集成至内核内的消息,且越来越多的嵌入式开发可以使用Rust编程.以往笔者的技术栈只有 C语言 ,C++也只是浅尝 ...

  4. http://dl-ssl.google.com/android上不去解决方案

    转:https://blog.csdn.net/j04110414/article/details/44149653/ 一. 更新sdk,遇到了更新下载失败问题: Fetching https://d ...

  5. C#获取http图片

    public Image GetHttpImage(string url) { var client = new HttpClient(); var uri = new Uri(Uri.EscapeU ...

  6. (2)用Micropython将ESP32数据上云

    之前我们尝试过直接把LED点亮并且闪烁. 今天尝试一下将LED的开关状态上云,并可以通过云来进行数据下发. 数据要上云,首先开发板要联网. 首先我们会用 Python的network 库, 在netw ...

  7. T-SQL的游标和fetch

    很多时候我们sql操作会得到一个结果集合,当我们需要依次查看集合内的内容时,我们便需要游标特性了. 所以,sql的游标类似c++里容器的迭代器,下面举个例子来辅助理解: DECLARE vend_cu ...

  8. DispatcherServlet的init源代码

    springmvc执行过程源代码分析 1,tomcat启动,创建容器的过程 通过load-on-start标签指定的1,创建DispatcherServlet对象, DispatcherServlet ...

  9. ansible roles实践——安装java

    [root@master] /etc/ansible$ cat roles/java/tasks/main.yml ---- name: unzip jdk unarchive: src=jdk-8u ...

  10. java 方法实例

    // 方法 public class Demo { public static void main(String[] args) { m(); m2(2); m3('3', 4); m4(4, 6); ...