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