python面向对象编程三大特性
小结:前面我们说完了类和对象的关系,相信对类和对象的理解更加透彻..让我们一起去研究面向对象的三大特性吧....
继承
1.什么继承?
在程序中继承就是事物之间的所属关系.
2.继承的语法: 单继承 和多继承
#单继承 class A:pass class B(A):pass #B类继承了A类 A为父类,B为子类 print(B.__bases__) # __bases__ 查看所有继承的父类 #多继承 class C:pass class D:pass class E(C,D):pass # E类继承了C,D两个类,其中C,D 都是父类,E类是子类
A类 : 父类,也称基类/超类.
B类:子类,也成派生类
3.父类和子类的关系
1. 子类可以继承父类的方法和属性
常规继承
class Animal: def __init__(self,name,kind,languge): self.name = name self.kind = kind self.languge = languge def eat(self): print('%s is eattint'%(self.name)) def drink(self): print('%s is drinking'%self.name) def yell(self): print('%s say %s'%(self.name,self.languge)) class Cat(Animal):pass class Dog(Animal):pass small_cat =Cat('small_cat','persian','mews') small_dog =Dog('small_dog','Huskil','yap') small_cat.yell() #Cat类没有__init__方法,继承父类中的属性和方法,在Animal类找到init方法进行执行. small_dog.drink() print(small_dog.name)
分析实例化执行流程: 以Cat类为例
1.首先先开辟一块内存空间,并且内存空间有一个类指针,指向Cat,
2.然后执行init方法,在Cat中并没有init方法,于是找Animal父类中init方法
3.将空间返回给small_cat
2.如果子类也中拥有自己的属性怎么继承呢?
class Animal: def __init__(self,name,kind,language): self.name = name self.kind = kind self.language = language def yell(self): print('%s say %s'%(self.name,self.language)) class Cat(Animal): #子类中拥有自己的方法 def climb(self): # 派生方法 print('%s can climb'%self.name) class Dog(Animal): # 派生方法 def lookafter_door(self): print('%s can look after door'%self.name) small_cat =Cat('small_cat','persian','mews') small_dog =Dog('small_dog','Huskil','yap') small_cat.climb() #自己有方法用自己 small_dog.lookafter_door() #同理 animal_1 = Animal('大金鱼','鱼','吐泡泡') animal_1.climb() # 父类调用子类的方法直接报错
从中分析子类调用方法:1.子类有自己的方法就用自己,用了自己的就不可以用父类的
2.子类中没有方法直接用父类的
3.子类有个性化方法,单独定义在子类中 -->派生方法
4.子类可以调用父类,父类不能调用子类.
3.子类和父类的方法相同又都想用怎么办?
class Animal: def __init__(self,name,kind,language): self.name = name self.kind = kind self.language = language def sleep(self): print('%s 在睡觉'%self.name,) class Cat(Animal): def climb(self): # 派生方法 print('%s can climb'%self.name) def sleep(self): Animal.sleep(self) # 父类名,主动传self 实现调用父类同名方法 #super().sleep() 当然这种 super(self,Cat).方法名() 也可以 print('团着睡') small_cat =Cat('small_cat','persian','mews') small_cat.sleep() #如果需要既执行父类方法sleep,又要执行Cat类自己方法.达到特定的效果.就需要调用父类了 总结:当某一个方法,父类和子类都拥有的时候,那么在子类的方法中,调用父类的同名方法 1.父类名.方法名(self,...) 2.super().方法名(...)
4.为什么有继承?
几个类之间有重复的属性和方法,把相同的属性和方法都抽象出来,作为父类,子类取继承父类. 为了解决类与类之间代码重复的问题.
请看看示例代码:
#动物类 class Animal: def __init__(self,name,hp,ad): self.name = name self.hp = hp self.ad = ad class People(Animal): def __init__(self, name, sex, hp, ad): super().__init__(name,hp,ad) self.sex = sex def attack(self,giant): print('%s发起了攻击了%s'%(self.name,giant.name)) giant.hp -= Sheldon.ad print('%s的HP剩余%s' % (giant.name, giant.hp)) # #怪兽类 class Monster(Animal): def __init__(self,name,kind,hp,ad): super().__init__(name,hp,ad) self.kind = kind def bite(self,Sheldon): print('%s撕咬了%s'%(self.name,Sheldon.name)) Sheldon.hp -= giant.ad print('%s的HP剩余%s'%(Sheldon.name,Sheldon.hp)) giant = Monster('giant','big',100,20) Sheldon = People('sheldon','male',100,10) Sheldon.attack(giant) giant.bite(Sheldon)
.....