python基础——继承与派生

1 什么是继承:

继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类成为基类或超累,新建的类成为派生类或子类

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

 class ParentClass1:#定义父类passclass ParentClass2:#定义父类passclass SubClass1(ParentClass1):#单继承,基类是parentClass1,派生类是SubClasspassclass SubClass2(ParentClass1,ParentClass2):#python支持多继承,用逗号分割开多个继承的类pass

 

1.2 查看继承 

>>> SubClass1.__bases__
(<class '__main__.ParentClass1'>,)
>>> SubClass2.__bases__
(<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)

提示:如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现。

>>> ParentClass1.__bases__
(<class 'object'>,)
>>> ParentClass2.__bases__
(<class 'object'>,)

1.3 继承与抽象(先抽象在继承)

抽象即抽取类似或者说比较像的部分。

抽象分成两个层次:

1.将奥巴马和梅西这俩对象比较像的部分抽取成类;

2.将人,猪,狗这三个类比较像的部分抽取成父类。

抽象最主要的作用是划分类别(可以隔离关注点,降低复杂度)

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

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

例子:

class Animal:def __init__(self,name,age):self.name=nameself.age=agedef walk(self):def say(self):print('%s is saying'%self.name)
class People(Animal):pass
class Pig(Animal):pass
class Dog(Animal):passp1=People("obama",50)print(p1.name)
print(p1.age)p1.walk() #先找walk名字 找相应的值,去父类找p1.say()

obama
50
obama is walking
obama is saying

  

1.4 继承与重用性

在开发程序的过程中,如果我们定义了一个类A,然后又想新建立另外一个类B,但是类B的大部分内容与类A的相同时

我们不可能从头开始写一个类B,这就用到了类的继承的概念。

通过继承的方式新建类B,让B继承A,B会‘遗传’A的所有属性(数据属性和函数属性),实现代码重用

class Hero:def __init__(self,nickname,aggressivity,life_value):self.nickname=nicknameself.aggressivity=aggressivityself.life_value=life_valuedef move_forward(self):print('%s move forward' %self.nickname)def move_backward(self):print('%s move backward' %self.nickname)def move_left(self):print('%s move forward' %self.nickname)def move_right(self):print('%s move forward' %self.nickname)def attack(self,enemy):enemy.life_value-=self.aggressivity
class Garen(Hero):passclass Riven(Hero):passg1=Garen('草丛伦',100,300)
r1=Riven('锐雯雯',57,200)print(g1.life_value)
r1.attack(g1)
print(g1.life_value)'''
运行结果
300
243
'''

  

1.5 继承与派生

1、派生,父类里面没有的,在子类里面定义独有的,派生出新的东西。

2、派生出父类里面重名的东西,再找先找用子类自己的构造方法。

例子:父类里面没有的,在子类里面定义独有的

class Hero:def __init__(self,nicname,aggressivity,life_value):self.nicname=nicnameself.aggressivity=aggressivityself.life_value=life_valuedef attack(self,enemy):enemy.life_value-=self.aggressivity
class Garen(Hero):camp='Demacia'class Riven(Hero):camp='Noxus'g1=Garen('garen',18,200)
r1=Riven('riven',18,200)
print(g1.camp)
print(r1.camp)

输出结果为:

Demacia
Noxus

父类里面重名的东西,再找先找用子类自己的构造方法。

class Hero:def __init__(self,nicname,aggressivity,life_value):self.nicname=nicnameself.aggressivity=aggressivityself.life_value=life_valuedef attack(self,enemy):print('Hero attack')enemy.life_value-=self.aggressivity
class Garen(Hero):camp='Demacia'def attack(self,enemy):Hero.attack(self,enemy)print('from garen attack')def fire(self):print('%s is firing'%self.nicname)class Riven(Hero):camp='Noxus'g1=Garen('garen',18,200)
r1=Riven('riven',18,200)
print(g1.camp)
g1.attack(r1)
print(g1.camp)

输出结果为:

Hero attack
from garen attack
Demacia

  

延续第二种:在子类里面添加新的独有的功能,如:“script”garen独有的,但是garen的身份在父类里,可以重用父类的功能

在子类中,重用父类的函数,父类名.父类函数(参数)

class Hero:def __init__(self,nicname,aggressivity,life_value):self.nicname=nicnameself.aggressivity=aggressivityself.life_value=life_valuedef attack(self,enemy):print('Hero attack')enemy.life_value-=self.aggressivity
class Garen(Hero):camp='Demacia'def __init__(self,nicname,aggressivity,life_value,script):Hero.__init__(self,nicname,aggressivity,life_value)self.script=scriptdef attack(self,enemy):Hero.attack(self,enemy)print('from garen attack')
g1=Garen('garen',18,2,'人在塔在')print(g1.script)

输出结果为:

人在塔在

  

2、组合  

软件重用的重要方式除了继承之外还有另外一种方式,即:组合

组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合

组合对比继承来说,也是用来重用代码,但是组合描述的是一种“有的关系”

2.1 组合的方式:

用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,比如老师学生有python课程

class Teacher:def __init__(self,name,sex,course):self.name=nameself.sex=sexself.course=course
class Student:def __init__(self,name,sex,course):self.name=nameself.sex=sexself.course=course
class Course:def __init__(self,name,price,period):self.name=nameself.price=priceself.period=period
Course_obj=Course('python','15800','7m')
t1=Teacher('allen','male',Course_obj)
s1=Student('susan','male',Course_obj)
print(s1.course.name)
print(t1.course.name)

输出结果为:

python
python

组合与继承都是有效地利用已有类的资源的重要方式。但是二者的概念和使用场景皆不同 

2.2 继承的方式:

通过继承建立了派生类与基类之间的关系,它是一种'是'的关系,比如白马是马,人是动物。

当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好,比如教授是老师

>>> class Teacher:
...     def __init__(self,name,gender):
...         self.name=name
...         self.gender=gender
...     def teach(self):
...         print('teaching')
...
>>>
>>> class Professor(Teacher):
...     pass
...
>>> p1=Professor('egon','male')
>>> p1.teach()
teaching

转载于:https://www.cnblogs.com/niejinmei/p/6762317.html

python基础——继承与派生、组合相关推荐

  1. Python基础——继承、多态

    文章目录 一.slots 二.私有属性和私有方法 三.继承 1.私有属性.私有方法 2.继承的特点(多层继承) 3.新式类和经典类 四.方法的重写 五.多态 一.slots __slots__属性对应 ...

  2. python基础 继承

    继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父 ...

  3. python基础------继承特性

    目录 一.定义 1.定义: 2.在Python3 中一个类没有继承另一个类,自动继承object类 二.继承语法 1.语法: 2.类的分类: 3.查看继承的父类 1.格式: 三.方法的复写 1.定义: ...

  4. c++基础-继承与派生,定义基类person和公有派生类student

    ①定义基类person,数据成员name,sex,age,构造函数,析构函数,输出name,sex,age的函数display(). ②定义公有派生类student,数据成员:num,构造函数,析构函 ...

  5. python在数据分析方面的应用、下列说法正确_智慧树知到大数据分析的python基础答案...

    智慧树知到大数据分析的python基础答案 在派生类中可以通过 " 基类名 . 方法名 ()" 的方式来调用基类中的方法 . 下面代码的执行结果是 : ( ) a = 10.99 ...

  6. pythond的执行原理_python基础——继承实现的原理

    python基础--继承实现的原理 1 继承顺序 class A(object): def test(self): print('from A') class B(A): def test(self) ...

  7. Python基础20-面向对象:静态、组合、继承与派生、多态、封装、反射、内置attr方法等

    目录 静态 静态属性@property 类方法@classmethod 静态方法@staticmethod 组合 继承与派生 继承与派生 继承顺序 在子类中调用父类方法与super 多态 封装 反射 ...

  8. Python基础系列讲解——继承派生和组合的概念剖析

    Python作为一门面向对象的语言,它的面向对象体系中主要存在这么两种关系,一个是"类"和"实例"的关系,另一个是"父类"和"子类 ...

  9. python组合和继承_Python基础系列讲解——继承派生和组合的概念剖析

    Python作为一门面向对象的语言,它的面向对象体系中主要存在这么两种关系,一个是"类"和"实例"的关系,另一个是"父类"和"子类 ...

最新文章

  1. 在计算机术语中常用byte表示,2016年计算机一级MS Office上机考试题
  2. k8s master ping不通node_搭建k8s可用集群
  3. Mybatis的xml配置备忘
  4. Struts2.0实现的文件上传(单附件和多附件)以及附件下载功能
  5. OpenCV图像分割Grabcut算法
  6. 第十一章:【UCHome二次开发】功能修改
  7. 关于udelay(); mdelay(); ndelay(); msleep();
  8. Python中的字典(Dictionary)
  9. Java fluent风格
  10. 顶点计划:寝室作息讨论
  11. 51单片机开发第一步 keilC51 以及 proteus 的安装
  12. Linux局域网多人聊天软件
  13. 福禄克气体流量校准解决方案
  14. List1_Excise
  15. STM32实现的语音识别的智能垃圾桶
  16. 死锁预防之银行家算法
  17. 情商决定了工作方面的成就
  18. 【软件测试】软件测试基础知识
  19. Ubuntu基本使用指南
  20. 技术背景的创业者由于其秉性容易犯三种错误

热门文章

  1. 将页面元素置为不可修改Readonly,所有元素统一修改,统一调用
  2. Jquery DIV滚动至浏览器顶部后固定不动代码
  3. 2022-2028年中国AKD施胶剂行业市场研究及前瞻分析报告
  4. 2022-2028年中国封装用胶膜行业运营现状及投资发展潜力报告
  5. SpringBoot2.x 不反回空值属性
  6. django自带的分页功能
  7. linux vi编辑 整理
  8. FinFET与2nm晶圆工艺壁垒
  9. PyTorch 自动微分示例
  10. CodeGen API分析