# 一、什么是继
# 继承是一种创建新类的方式,在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. Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例

    1.重写equals方法实例   部分代码参考http://blog.csdn.net/wangloveall/article/details/7899948 重写equals方法的目的是判断两个对象 ...

  2. 【转】HttpHandler的认识与加深理解

    原文:http://www.cnblogs.com/whtydn/archive/2009/10/19/1585778.html HttpHandler是HTTP请求的处理中心,真正地对客户端请求的服 ...

  3. 如何将硕大笨重的git仓库拆分成灵活轻巧的模块小仓库

    方法1.拆分一个子目录为独立仓库 参考链接:https://segmentfault.com/a/1190000002548731 以前是用 filter-branch 来实现,这个需求太常见了,有人 ...

  4. Codeforces 710C. Magic Odd Square n阶幻方

    C. Magic Odd Square time limit per test:1 second memory limit per test:256 megabytes input:standard ...

  5. cxf soap rest webservice spring

    1. 导入 jar 包 2. 编写接口 3. 编写实现 4. 配置spring 配置文件 5. 配置web.xml servlet 6. 访问 package com.diancai.test; im ...

  6. 关闭文件描述符-close

    头文件:#include<unistd.h> 原型:int close(int fd); 返回值:成功返回0,失败返回-1.

  7. socketpair初识

    #include <stdio.h>  #include <string.h>  #include <unistd.h>  #include <sys/typ ...

  8. 【Web】网站主如何更改网页标签的图标(favicon.ico)

    修改web项目的favicon图标,方式有两种:全局方式和局部方式 全局方式: 进入服务器\webapps\ROOT,然后用自己的favicon.ico替换服务器自带的favicon.ico图片 局部 ...

  9. Linux应用开发入门(转)

    今天偶然看到这篇文章,做个入门了解还是不错的. 前一阵子在QQ上和朋友聊天的时候,总会看到有人说Linux上的应用程序开发是高手才可以完成的,而且这种“迷信”在目前似乎还很普遍.然而,情况并不是这样的 ...

  10. HDU 5957 Query on a graph (拓扑 + bfs序 + 树剖 + 线段树)

    题意:一个图有n个点,n条边,定义D(u,v)为u到v的距离,S(u,k)为所有D(u,v)<=k的节点v的集合 有m次询问(0<=k<=2): 1 u k d:将集合S(u,k)的 ...