python基础——继承与派生、组合
python基础——继承与派生
1 什么是继承:
继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类成为基类或超累,新建的类成为派生类或子类
1.1 继承分为:单继承和多继承
class ParentClass1:#定义父类
pass class ParentClass2:#定义父类
pass class SubClass1(ParentClass1):#单继承,基类是parentClass1,派生类是SubClass
pass class 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=name
self.age=age
def walk(self):
def say(self):
print('%s is saying'%self.name)
class People(Animal):
pass
class Pig(Animal):
pass
class Dog(Animal):
pass
p1=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=nickname
self.aggressivity=aggressivity
self.life_value=life_value def 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):
pass class Riven(Hero):
pass g1=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=nicname
self.aggressivity=aggressivity
self.life_value=life_value
def 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=nicname
self.aggressivity=aggressivity
self.life_value=life_value
def 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=nicname
self.aggressivity=aggressivity
self.life_value=life_value
def 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=script
def 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=name
self.sex=sex
self.course=course
class Student:
def __init__(self,name,sex,course):
self.name=name
self.sex=sex
self.course=course
class Course:
def __init__(self,name,price,period):
self.name=name
self.price=price
self.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
python基础——继承与派生、组合的更多相关文章
- python基础----继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法
一.什么是继承 继承是一种创建新的类的方式,在pyth ...
- Python基础-继承与派生
一.继承 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继承 class P ...
- python基础——继承和多态
python基础——继承和多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类 ...
- python基础——继承实现的原理
python基础--继承实现的原理 1 继承顺序 class A(object): def test(self): print('from A') class B(A): def test(self) ...
- Python基础篇(四)_组合数据类型的基本概念
Python基础篇——组合数据类型的基本概念 集合类型:元素的集合,元素之间无序 序列类型:是一个元素向量,元素之间存在先后关系,通过序号进行访问,没有排他性,具体包括字符串类型.元组类型.列表类型 ...
- python之继承与派生
1 继承 继承的概念:继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继承 继 ...
- python基础===继承
编写类时,并非总是要从空白开始.如果你要编写的类是另一个现成类的特殊版本,可使用继承.一个类继承另一个类时,它将自动获得另一个类的所有属性和方法:原有的类称为父类,而新类称为子类.子类继承了其父类的所 ...
- python基础===继承和多继承
继承 class A: def spam(self): print("A.SPAM") def add(self, x,y): return x+y class B(A): def ...
- python基础之继承派生、组合、接口和抽象类
类的继承与派生 经典类和新式类 在python3中,所有类默认继承object,但凡是继承了object类的子类,以及该子类的子类,都称为新式类(在python3中所有的类都是新式类) 没有继承obj ...
随机推荐
- ConcurrentHashMap源码解析(JDK1.8)
package java.util.concurrent; import java.io.ObjectStreamField; import java.io.Serializable; import ...
- 1-1 maven 学习笔记(1-6章)
一.基础概念 1.Maven作为Apache组织中颇为成功的开源项目,主要服务于基于Java平台的项目构建,依赖管理和项目信息管理.从清理,编译,测试到生成报告,到打包部署,自动化构建过程. 还可以跨 ...
- return false与return true的区别
<a href="http://www.baidu.com" onclick="alert(11);return true;alert(22)">链 ...
- 【Python】 MySQLdb的安装与使用
MySQLdb MySQLdb是一款较为底层的,python连接mysql用的模块.和更加高级的,提供ORM的模块不同,MySQLdb主要还是聚焦于如何和数据库进行连接和进行基本的操作,操作的体现形式 ...
- Linux下面如何用tcpdump抓包
很多时候我们的系统部署在Linux系统上面,在一些情况下定位问题就需要查看各个系统之间发送数据报文是否正常,下面我就简单讲解一下如何使用tcpdump抓包 tcpdump是Linux下面的一个开源的抓 ...
- javaScript设计模式-创建型设计模式
我们大家一听到设计模式就感觉设计模式是一个高端的东西,到底什么是设计模式呢?其实设计模式也就是我们的前辈在写代码的时候遇到的问题,提出的解决方案,为了方便人与人之间的交流,取了个名字,叫做设计模式. ...
- java中volatile
volatile用来修饰变量.Java 语言中的 volatile 变量可以被看作是一种 "程度较轻的 synchronized":与 synchronized 块相比,volat ...
- eclipse配置svn方法
一.在Eclipse里下载Subclipse插件 方法一:从Eclipse Marketplace里面下载 具体操作:打开Eclipse --> Help --> Eclipse Mark ...
- JavaScript(第二天)【语法,变量】
一.语法构成 区分大小写 ECMAScript中的一切,包括变量.函数名和操作符都是区分大小写的.例如:text和Text表示两种不同的变量. 标识符 所谓标识符,就是指变量.函数.属性的名字,或 ...
- String [] 转 List<String>
整理笔记:String [] 转 List<String> String [] al = new String[]{"1","q","a& ...