# 一、什么是继承
# 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可成为基类或超类,新建类称为派生类或子类.
# python中类的继承分为:单继承和多继承
class ParentClass1 : #定义父类.
pass
class ParentClass2: #定义父类.
pass
class SubClass1(ParentClass1):#单继承,基类是ParentClass1.
pass
class SubClass2(ParentClass1,ParentClass2):#python 支持多继承,用逗号分开多个继承的类
pass
#查看继承
print(SubClass1.__base__) #只查看从左到右继承的第一个子类,__bases__则是查看继承的所有父类
# <class '__main__.ParentClass1'> print(SubClass2.__bases__) #查看所有继承的父类
# (<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)
# 提示:如果没有指定基类,python的类会默认继承object类,他提供了一些常见方法 print(ParentClass1.__bases__)
#结果(<class 'object'>,) print(ParentClass2.__bases__)
#结果(<class 'object'>,) 继承与抽象 抽象即抽取类似或者说比较像的部分
抽象分为两个层次 1.将奥巴马和梅西这两个对象比较像的部分抽取成类
2. 将人 ,猪,狗这三个类比较像的部分抽取成父类. 抽象最主要的作用是划分类别(可以隔离关注点,降低复杂度)

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

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



二、继承的精讲

# 猫类:吃eat, 喝drink,睡sleep ,爬树 climb
#狗类:吃eat ,喝drink,睡sleep ,看家 watch
# class Pet:
# def __init__(self,name,kind,food):
# self.name =name
# self.kind =kind
# self.food = food
# def eat(self):
# print('%s 吃%s'%(self.name,self.food))
# def drink(self):
# print('%s在喝水'%self.name)
# def sleep(self):
# print('%s在家睡觉'%self.name) class Cat(Pet):
    def climb(self):#派生方法
print('%s在爬树'%self.name)
class Dog(Pet):
def watch(self):#派生方法.
print('%s在看家' %self.name)
tom =Cat('Tom','mao','猫粮') #子类使用名字(方法和静态变量),如果在子类中没有,就使用父类的
#Cat('tom',mao’,'猫粮')实例化
# 实例化这个类
#常见一个空对象
#执行__init__方法:子类没有用父类的
hei=Dog('小黑',"2哈",'狗粮')
tom.eat() #Tom 吃猫粮
hei.eat() #小黑 吃狗粮
hei.watch() #小黑在看家
tom.climb() #Tom在爬树 在开发程序的过程中,如果我们定义了一个类A ,然后取想建立另外一个类B,但是类B的大部分内容与类A的相同时,我们不可能从一开始写一个类B ,这就用到了类的继承的概念。
通过继承的方式新建类B,让B继承A ,B会遗传A的所有属性(数据属性和函数属性),实现代码的重用 三、人狗大战基于继承
class Animal: #动物
def __init__(self,name,aggr,hp):#方法 动态属性 内置的双下方法
self.name=name #对象属性 实例属性
self.aggr =aggr
self.hp =hp
class Person(Animal): #类名 Person
def __init__(self,name,sex,aggr,hp):
self.sex =sex #派生属性
# Animal.__init__(self,name,aggr,hp)
super().__init__(name,aggr,hp)
def attack(self,dog):#自定义方法
print('%s 打了 %s'%(self.name,dog.name))
dog.hp-=self.aggr
class Dog(Animal):
def __init__(self,name,kind,aggr,hp):
self.kind =kind#派生属性
Animal.__init__(self,name,aggr,hp)
super().__init__(name,aggr,hp)
def bite(self,person):
print('%s 咬了%s'%(self.name,person.name))
person.hp -=self.aggr
alex =Person('alex','不详',1,150)
# 首先创建一个person的对象
# 初始化:找init方法,自己有调用自己的.
#父类和子类拥有同名的方法时,子类的对象只会调用子类的
#如果想要调用父类的方法,需要 父类名.方法名(self,其他参数)
hei =Dog('小黑','teddy',260,10000)
alex.attack(hei)
hei.bite(alex) # 输出结果
# alex 打了 小黑
# 小黑 咬了alex 四、super关键字
#super
class Animal: #动物
def __init__(self,name,aggr,hp):#方法动态属性
self.name =name #实例属性
self.aggr =aggr
self.hp =hp
def eat(self):
print('in Animal eat')
class Person(Animal):#类名Person
def __init__(self,name,sex,aggr,hp):
self.sex = sex
super().__init__(name,aggr,hp)
Animal.__init__(self,name,aggr,hp)
def eat(self):
print('in Person eat')
Animal.eat(self)
super().eat()
alex = Person('alex','不详',1,250)
Animal.eat(alex)
super(Person,alex).eat() 五、多继承问题
class A:
def wangwang(self):
print('in A')
class B(A):
def wangwang(self):
super().wangwang() # 'in C '
print('in B')
class C(A):
def wangwang(self):
print('in C')
class D(B,C):pass d = D()
d.wangwang() 答案: D中没有方法去 B 类中查找,其中B类中super().wangwang 按广度优先查找到C类中查找,最终结果为
in C
in B

# python3中的所有类 都默认继承object ,如果一个类 继承了object 这个类就被称为新式类。python3里都为广度优先法则

 

#经典类 遵循 深度优先算法 且没有mro方法 python2
#新式类 遵循 广度优先算法 有mro方法 py2 py3
# py3 super
# 单继承中 super就是找父类
# 多继承 super寻找的轨迹是根据mro(广度优先)顺序的

 

  

												

Day 24 继承的更多相关文章

  1. DAY 24继承与组合

    一.继承 继承就是子类与父类形成的一种关系,可以让子类能直接从父类中获取属性与方法 优点:减少了类与类之间的代码冗余 语法: class 父类: # 父类是多个有共同点的普通类抽离共有属性与方法形成的 ...

  2. JavaScript 面向对象与原型

    ECMAScript有两种开发模式:1.函数式(过程化);2.面向对象(OOP); 一 创建对象1.普通的创建对象 ? 1 2 3 4 5 6 7 8 9 // 创建一个对象,然后给这个对象新的属性和 ...

  3. .NET知识点总结二(笔记整合)

    19.什么是类型? 用来定义某一种数据在内存里开辟空间的大小,还可以预置操作此种类型数据的相关方法 20.this关键字在方法中使用时所代表的含义 this指的是当前类的对象,或者父类的类的对象(ba ...

  4. maven学习--进阶篇

    2016-01-06 02:34:24 继承与聚合 (八)maven移植 讲到maven移植,大家可能第一反应就是是指将一个java项目部署到不同的环境中去,实际上,在maven中,它认为当你参加一个 ...

  5. 从Zero到Hero,一文掌握Python关键代码

    # 01基础篇 # 变量 #int one=1 some_number=100 print("one=",one) #print type1 print("some_nu ...

  6. iOS 杂笔-24(常用类到NSObject的继承列表)

    iOS 杂笔-24(常用类到NSObject的继承列表) NSString NSObject->NSString NSArray NSObject->NSArray ↑OC基本类都直接继承 ...

  7. 夺命雷公狗—angularjs—24—extend继承对象

    我们的angularjs中也是给我们留下了方法来做继承的,那么他就是传授中的extend... 不过要如下所示,第二个参数是继承到第一个对象里面的... <!DOCTYPE html> & ...

  8. day 24 面向对象之继承及属性查找顺序

    组合 组合:自定义类的对象作为另外一个类的属性 class Teacher: def init(self, name, age): self.name = name self.age = age t1 ...

  9. 24 类:组合 继承 super关键字 面向对象的三大性

    组合 组合:自定义类的对象作为另外一个类的属性 class Teacher: def __init__(self, name, age): self.name = name self.age = ag ...

随机推荐

  1. jDeveloper运行慢

    最近在使用 Jdeveloper 10.1.3.3 版本时发现速度奇慢无比,后经Google,发现如下解决方案:在 jdev.conf 文件的末尾加上如下两行,速度即可得到显著的提高. AddVMOp ...

  2. win, cmd下安装mysql(win真tm难用)

    常用命令: 修改root用户密码 update mysql.user set authentication_string=password('1234qwer') where user='root' ...

  3. debuginfo介绍

    一.简介 深入理解debuginfo http://blog.csdn.net/chinainvent/article/details/24129311?reload 关于DWARF http://w ...

  4. PAT 1047 编程团体赛(代码)

    1047 编程团体赛(20)(20 分) 编程团体赛的规则为:每个参赛队由若干队员组成:所有队员独立比赛:参赛队的成绩为所有队员的成绩和:成绩最高的队获胜. 现给定所有队员的比赛成绩,请你编写程序找出 ...

  5. 论坛遇到附件上传失败问题总结(discuz)

    (1)bbs/source/class/class_upload.php 50行左右,注释$attach['target'] $attach['target'] = DISCUZ_ROOT.'./da ...

  6. 洛谷 P2986 [USACO10MAR]伟大的奶牛聚集(树形动规)

    题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of cours ...

  7. Eloquent Observer 的小坑

    前言 最近开发新的项目不是基于完整的 laravel 框架,框架是基于 laravel ORM 的简单MVC模式.随着项目的成熟和业务需求,需要引入事件机制.简单地浏览了一下 symfony.lara ...

  8. vue的过滤器

    Vue.Js 提供了强大的过滤器API,能够对数据进行各种过滤处理,返回需要的结果 vue的过滤器一般在JavaScript 表达式的尾部,由“|”符号指示: 过滤器可以让我们的代码更加优美,一般可以 ...

  9. 使用Application Center Test (ACT)来做压力测试 【转】

    在我们完成了基于SPS2003的开发,实现了我们的具体应用以后,我们是不是就可以直接请用户来使用了呢?如果我这么做,那么有经验的开发人员一定会对此嗤之以鼻:居然连压力测试也不做!真是不想活了…… 呵呵 ...

  10. 乞丐版servlet容器第3篇

    4 EventListener接口 让我们继续看SocketConnector中的acceptConnect方法: @Override protected void acceptConnect() t ...