继承是一种建立新类的方式,在python中,新建的类能够继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类。python
class ParentClass1: #定义父类
pass
class ParentClass2: #定义父类
pass
class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
pass
class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
pass
查看继承编程
>>> SubClass1.__bases__ #__base__只查看从左到右继承的第一个子类,__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'>,)
抽象即抽取相似或者说比较像的部分。ide
抽象分红两个层次: 函数
1.将奥巴马和梅西这俩对象比较像的部分抽取成类; spa
2.将人,猪,狗这三个类比较像的部分抽取成父类。设计
抽象最主要的做用是划分类别(能够隔离关注点,下降复杂度)code
继承:是基于抽象的结果,经过编程语言去实现它,确定是先经历抽象这个过程,才能经过继承的方式去表达出抽象的结构。对象
抽象只是分析和设计的过程当中,一个动做或者说一种技巧,经过抽象能够获得类blog
复制代码 ==========================第一部分 例如 猫能够:喵喵叫、吃、喝、拉、撒 狗能够:汪汪叫、吃、喝、拉、撒 若是咱们要分别为猫和狗建立一个类,那么就须要为 猫 和 狗 实现他们全部的功能,伪代码以下: #猫和狗有大量相同的内容
class 猫: def 喵喵叫(self): print '喵喵叫'
def 吃(self): # do something
def 喝(self): # do something
def 拉(self): # do something
def 撒(self): # do something
class 狗: def 汪汪叫(self): print '汪汪叫'
def 吃(self): # do something
def 喝(self): # do something
def 拉(self): # do something
def 撒(self): # do something
==========================第二部分 上述代码不难看出,吃、喝、拉、撒是猫和狗都具备的功能,而咱们却分别的猫和狗的类中编写了两次。若是使用 继承 的思想,以下实现: 动物:吃、喝、拉、撒 猫:喵喵叫(猫继承动物的功能) 狗:汪汪叫(狗继承动物的功能) 伪代码以下: class 动物: def 吃(self): # do something
def 喝(self): # do something
def 拉(self): # do something
def 撒(self): # do something
# 在类后面括号中写入另一个类名,表示当前类继承另一个类
class 猫(动物): def 喵喵叫(self): print '喵喵叫'
# 在类后面括号中写入另一个类名,表示当前类继承另一个类
class 狗(动物): def 汪汪叫(self): print '汪汪叫'
==========================第三部分 #继承的代码实现
class Animal: def eat(self): print("%s 吃 " %self.name) def drink(self): print ("%s 喝 " %self.name) def shit(self): print ("%s 拉 " %self.name) def pee(self): print ("%s 撒 " %self.name) class Cat(Animal): def __init__(self, name): self.name = name self.breed = '猫'
def cry(self): print('喵喵叫') class Dog(Animal): def __init__(self, name): self.name = name self.breed='狗'
def cry(self): print('汪汪叫') # ######### 执行 #########
c1 = Cat('小白家的小黑猫') c1.eat() c2 = Cat('小黑的小白猫') c2.drink() d1 = Dog('胖子家的小瘦狗') d1.eat() 使用继承来重用代码比较好的例子
在开发程序的过程当中,若是咱们定义了一个类A,而后又想新创建另一个类B,可是类B的大部份内容与类A的相同时
咱们不可能从头开始写一个类B,这就用到了类的继承的概念。
经过继承的方式新建类B,让B继承A,B会‘遗传’A的全部属性(数据属性和函数属性),实现代码重用
class Animal: ''' 人和狗都是动物,因此创造一个Animal基类 '''
def __init__(self, name, aggressivity, life_value): self.name = name # 人和狗都有本身的昵称;
self.aggressivity = aggressivity # 人和狗都有本身的攻击力;
self.life_value = life_value # 人和狗都有本身的生命值;
def eat(self): print('%s is eating'%self.name) class Dog(Animal): pass
class Person(Animal): pass egg = Person('egon',10,1000) ha2 = Dog('二愣子',50,1000) egg.eat() ha2.eat()
提示:用已经有的类创建一个新的类,这样就重用了已经有的软件中的一部分设置大部分,大大生了编程工做量,这就是常说的软件重用,不只能够重用本身的类,也能够继承别人的,好比标准库,来定制新的数据类型,这样就是大大缩短了软件开发周期,对大型软件开发来讲,意义重大。
固然子类也能够添加本身新的属性或者在本身这里从新定义这些属性(不会影响到父类),须要注意的是,一旦从新定义了本身的属性且与父类重名,那么调用新增的属性时,就以本身为准了。
class Animal: ''' 人和狗都是动物,因此创造一个Animal基类 '''
def __init__(self, name, aggressivity, life_value): self.name = name # 人和狗都有本身的昵称;
self.aggressivity = aggressivity # 人和狗都有本身的攻击力;
self.life_value = life_value # 人和狗都有本身的生命值;
def eat(self): print('%s is eating'%self.name) class Dog(Animal): ''' 狗类,继承Animal类 '''
def bite(self, people): ''' 派生:狗有咬人的技能 :param people: ''' people.life_value -= self.aggressivity class Person(Animal): ''' 人类,继承Animal '''
def attack(self, dog): ''' 派生:人有攻击的技能 :param dog: ''' dog.life_value -= self.aggressivity egg = Person('egon',10,1000) ha2 = Dog('二愣子',50,1000) print(ha2.life_value) print(egg.attack(ha2)) print(ha2.life_value)
注意:像ha2.life_value之类的属性引用,会先从实例中找life_value而后去类中找,而后再去父类中找...直到最顶级的父类。
在子类中,新建的重名的函数属性,在编辑函数内功能的时候,有可能须要重用父类中重名的那个函数功能,应该是用调用普通函数的方式,即:类名.func(),此时就与调用普通函数无异了,所以即使是self参数也要为其传值.
在python3中,子类执行父类的方法也能够直接用super方法.
(1)supper
class A: def hahaha(self): print('A') class B(A): def hahaha(self): super().hahaha() #super(B,self).hahaha()
#A.hahaha(self)
print('B') a = A() b = B() b.hahaha() super(B,b).hahaha()
(2)人狗大战
class Animal: ''' 人和狗都是动物,因此创造一个Animal基类 '''
def __init__(self, name, aggressivity, life_value): self.name = name # 人和狗都有本身的昵称;
self.aggressivity = aggressivity # 人和狗都有本身的攻击力;
self.life_value = life_value # 人和狗都有本身的生命值;
def eat(self): print('%s is eating'%self.name) class Dog(Animal): ''' 狗类,继承Animal类 '''
def __init__(self,name,breed,aggressivity,life_value): super().__init__(name, aggressivity, life_value) #执行父类Animal的init方法
self.breed = breed #派生出了新的属性
def bite(self, people): ''' 派生出了新的技能:狗有咬人的技能 :param people: ''' people.life_value -= self.aggressivity def eat(self): # Animal.eat(self)
#super().eat()
print('from Dog') class Person(Animal): ''' 人类,继承Animal '''
def __init__(self,name,aggressivity, life_value,money): #Animal.__init__(self, name, aggressivity, life_value)
#super(Person, self).__init__(name, aggressivity, life_value)
super().__init__(name,aggressivity, life_value) #执行父类的init方法
self.money = money #派生出了新的属性
def attack(self, dog): ''' 派生出了新的技能:人有攻击的技能 :param dog: ''' dog.life_value -= self.aggressivity def eat(self): #super().eat()
Animal.eat(self) print('from Person') egg = Person('egon',10,1000,600) ha2 = Dog('二愣子','哈士奇',10,1000) print(egg.name) print(ha2.name) egg.eat()
经过继承创建了派生类与基类之间的关系,它是一种'是'的关系,好比白马是马,人是动物。
当类之间有不少相同的功能,提取这些共同的功能作成基类,用继承比较好,好比教授是老师。
>>> 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 复制代码