9月18日学习内容整理:类和对象的继承
补充:
1、一个类中不可以有相同的动态属性名和静态属性名和对象属性名
2、面向对象三大特性:封装,继承,多态
一、继承
1、和组合的区别:组合是表现的是什么有什么的关系,继承表示的是 什么是什么 的关系,例如人是动物,桌子是家具
2、概念
(1)父类,超类,基类:说的是大范围的类,也就是被继承的
子类,派生类,说的是小范围的类,也就是继承的
(2)先抽象再继承:具体的实例——>小范围的类——>大范围的类,从左到右是抽象,从右到左是继承
(3)单继承:只继承一个父类 子类名(父类名)
多继承(实际中不应该用到很多的多继承):继承多个父类 子类名(父类名1,父类名2,.......)
(4)派生属性:除父类有的对象属性外,子类自己独有的对象属性称为派生属性
派生方法:子类的方法(函数)
3、怎么用
class 子类名(父类名):这样就是子类继承了父类
4、super()的用法
(1)应用场景:当子类的方法名(函数名)和父类的方法名重合时,使用super就可以在子类中调用父类的方法
(2)在定义类内部:这里要注意子类方法下写super执行完父类的方法后子类方法仍要执行直到结束
1) 函数定义下面写 super(). 方法名(需要参数就写上参数)(也就是函数名)
2)另一种写法:super(子类名,self). 方法名(需要参数就写上参数)
(3)在定义类外部:直接执行父类的相同函数名,不会再执行子类的方法
super(子类名,子类对象名). 方法名(需要参数就写上参数)
5、注意
(1)当父类和子类的方法重名时,要优先选用子类的方法
(2)当继承多个父类时,并且多个父类也有相同的方法名,子类运用super方法时会先找第一个父类,有就用第一个父类的方法,并且不会再往后找,若第一个父类没有
就找第二个父类,以此类推,总的原则就是只会用找到的第一个父类方法
(3)子类可以继承父类的所有方法和属性,但首先是找自己的,自己没有才去找父类的
(4)谁调用谁就是self
举例:
class A: def hahaha(self): print('A') class B(A): def hahaha(self): # super(B,self).hahaha() #在内部用的第一种写法 super().hahaha() #在内部用的第二种写法 print('B') #这一句也会被执行 b = B() b.hahaha() # super(B,b).hahaha() #在外部用
class A: def get(self): self.say() #还是会先找自己的,所以输出的是BBBBB def say(self): print('AAAAA') class B(A): def say(self): print('BBBBB') b = B() b.get()
class Chac: def __init__(self,name,aggr,blood): self.name=name self.aggr=aggr self.blood=blood class Dog(Chac): def __init__(self,name,aggr,blood,pin): super().__init__(name,aggr,blood) #先执行父类的 self.pin=pin #再继续执行 派生属性 def attack(self,person): print('sss') person.blood -= self.aggr class Person(Chac): def __init__(self,name,aggr,blood,qian): super().__init__(name,aggr,blood) self.qian=qian def bite(self,dog): print('aaa') dog.blood -= self.aggr gou=Dog('alex',12,23,'erha') ren=Person('egon',23,34,20000)