第二十四天 PYTHON学习

【今日学习】

一.初识继承

1、什么是继承

继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类又可称为基类或超类,新建的类称为派生类或子类。

子类会“”遗传”父类的属性,从而解决代码重用问题(比如练习7中Garen与Riven类有很多冗余的代码)

2、为什么要有继承(继承的好处)

因为有些类内的属性存在相同的地方,为了避免重用代码,需要让一个类去具备另一个类的特征和技能。

让一个类可以继承另一个类所具有的属性,这个继承类不仅有自身属性,而且还具有被继承类的属性。一个类不仅可以继承一个类,而且还可以继承多个类。

继承一个叫单继承,继承多个叫多继承。

3、如何区分谁应该继承谁的问题

先抽象再定义类,然后再区分谁继承谁的问题

站的高度不同,抽象出的类具备的特征与技能就不同,

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

抽象分成两个层次: 

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

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

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

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

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

 

4、继承之后的属性查找顺序问题

class Foo:
      def f1(self):
      print('Foo.f1')

def f2(self):
      print('Foo.f2')
     self.f1()

class Bar(Foo):
    def f1(self):
    print('Foo.f1')


b=Bar()
b.f2()

 

这段代码很好诠释了,继承之后的属性查找问题,当对象b查找f2函数时,首先在自身类找有没有这个属性,如果自身类找不到这个属性,再

往父辈那找,只要这个对象调用函数(技能),  那就优先去自身查找有没有这个属性。

 

二、派生

派生是对于继承类讲的,继承类不可能完全与父类具有相同额属性,还需要自身具备不一样的属性,这就是继承类的派生。

当然子类也可以添加自己新的属性或者在自己这里重新定义这些属性(不会影响到父类),需要注意的是,一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己为准了。

 

三、组合与派生

>>> class Equip: #武器装备类
... def fire(self):
... print('release Fire skill')
...
>>> class Riven: #英雄Riven的类,一个英雄需要有装备,因而需要组合Equip类
... camp='Noxus'
... def __init__(self,nickname):
... self.nickname=nickname
... self.equip=Equip() #用Equip类产生一个装备,赋值给实例的equip属性
...
>>> r1=Riven('锐雯雯')
>>> r1.equip.fire() #可以使用组合的类产生的对象所持有的方法
release Fire skill

 

 

四、组合与继承的区别

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

1.继承的方式

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

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

2.组合的方式

用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,比如教授有生日,教授教python和linux课程,教授有学生s1、s2、s3...

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

1.继承的方式

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

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

2.组合的方式

用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,比如教授有生日,教授教python和linux课程,教授有学生s1、s2、s3...

 组合与继承的区别代码描述:

class People:
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex

class Course:
def __init__(self,name,period,price):
self.name=name
self.period=period
self.price=price
def tell_info(self):
print('<%s %s %s>' %(self.name,self.period,self.price))

class Teacher(People):
def __init__(self,name,age,sex,job_title):
People.__init__(self,name,age,sex)
self.job_title=job_title
self.course=[]
self.students=[]


class Student(People):
def __init__(self,name,age,sex):
People.__init__(self,name,age,sex)
self.course=[]


egon=Teacher('egon',18,'male','沙河霸道金牌讲师')
s1=Student('牛榴弹',18,'female')

python=Course('python','3mons',3000.0)
linux=Course('python','3mons',3000.0)

#为老师egon和学生s1添加课程
egon.course.append(python)
egon.course.append(linux)
s1.course.append(python)

#为老师egon添加学生s1
egon.students.append(s1)


#使用
for obj in egon.course:
obj.tell_info()

当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好

posted @ 2018-10-23 16:41  runjam  阅读(105)  评论(0编辑  收藏  举报