继承: 解决代码的重复性
继承语法:
1 class A: 2 pass 3 class B(A): #父类名 4 pass 5 # B继承A,A是父类,B是子类 6 # A是父类 基类 超类 7 # B是子类 派生类
# 需求:定义一个动物类,让猫跟够继承动物类,动物类中的方法有吃,喝,睡
# 猫类:爬树
# 狗类:看家
# 子类可以使用父类重点的:方法,静态变量
1 class Animal: #动物 2 def __init__(self,name): 3 self.name = name 4 def eat(self): #吃 5 print('%s is 吃'% self.name) 6 def drink(self): #喝 7 print('%s is 喝' % self.name) 8 def sleep(self): #睡 9 print('%s is 睡' % self.name) 10 class Cat(Animal): #猫类继承动物类 11 def climb_tree(self): #爬树 12 print('%s is 爬树' % self.name) 13 class Dog(Animal): #狗类继承动物类 14 def Housekeeping(self): #看家 15 print('%s is看家'%self.name) 16 小花猫 = Cat('小花猫') #实例化 17 # 先开辟空间,空间里有一个类指针-->指向Cat 18 # 调用init,对象在自己的空间中找init没找到,到Cat类中找init也没找到, 19 # 找父类Animal中的init 20 小花猫.eat() 21 小花猫.sleep() 22 小花猫.climb_tree() 23 大黄狗 = Dog('大黄狗') 24 大黄狗.Housekeeping() 25 大黄狗.eat() 26 大黄狗.sleep() 27 # 结果: 28 # 小花猫 is 吃 29 # 小花猫 is 睡 30 # 小花猫 is 爬树 31 # 大黄狗 is看家 32 # 大黄狗 is 吃 33 # 大黄狗 is 睡
#当子类和父类的方法重名的时候,我们只使用子类的方法,而不会去调用父类的方法了
1 class Animal: #动物 2 def __init__(self,name): 3 self.name = name 4 def eat(self): #吃 5 print('%s is 吃'% self.name) 6 def drink(self): #喝 7 print('%s is 喝' % self.name) 8 def sleep(self): #睡 9 print('%s is 睡' % self.name) 10 class Cat(Animal): #猫类继承动物类 11 def eat(self): #子类跟父类从名 12 print('%s is 吃鱼' % self.name) 13 小白 = Cat('小白') 14 小白.eat() 15 # 结果: 16 # 小白 is 吃鱼
# 子类想要调用父类的方法的同时还想执行自己的同名方法
# 猫和狗在调用eat的时候既调用自己的也调用父类的,
# 在子类的方法中调用父类的方法 :父类名.方法名(self)
1 class Animal: #动物 2 def __init__(self,name): 3 self.name = name 4 def eat(self): #吃 5 print('%s is 吃'% self.name) 6 def drink(self): #喝 7 print('%s is 喝' % self.name) 8 def sleep(self): #睡 9 print('%s is 睡' % self.name) 10 class Cat(Animal): #猫类继承动物类 11 def eat(self): #吃,猫中自己的方法 12 print('猫吃鱼') 13 Animal.eat(self) #同名在子类调用父类中的方法 14 print('猫吃鱼') 15 def climb_tree(self): #爬树 16 print('%s is 爬树' % self.name) 17 class Dog(Animal): #狗类继承动物类 18 def Housekeeping(self): #看家 19 print('%s is看家' % self.name) 20 def eat(self): #吃,狗中自己的方法 21 Animal.eat(self)#同名在子类调用父类中的方法 22 print('狗吃骨头') 23 小猫 = Cat('小猫') 24 小狗 = Dog('小狗') 25 小猫.eat() 26 小狗.eat() 27 # 结果: 28 # 小猫 is 吃 29 # 猫吃鱼 30 # 小狗 is 吃 31 # 狗吃骨头
# 继承语法 class 子类名(父类名):pass
# 父类和子类方法的选择:
# 子类的对象,如果去调用方法
# 永远优先调用自己的
# 如果自己有 用自己的
# 自己没有 用父类的
# 如果自己有 还想用父类的 : 直接在子类方法中调父类的方法 父类名.方法名(self)
# 单继承
# 调子类的 : 子类自己有的时候
# 调父类的 : 子类自己没有的时候
# 调子类和父类的 :子类父类都有,在子类中调用父类的
单继承语法:
2 class D: 3 def func(self): 4 print('in D') 5 class C(D):pass 6 class A(C): 7 def func(self): 8 print('in A') 9 class B(A):pass 10 B().func() #==A().func 11 # 结果:in A 12 #A是B的父类,C是A的父类,D是C的父类
# 多继承 有好几个爹
# 有一些语言不支持多继承 java
# python语言的特点 : 可以在面向对象中支持多继承
# 一个类有多个父类,在调用父类方法的时候,按照继承顺序,先继承的就先寻找
多继承语法:
1 class B: 2 def func(self):print('in B') 3 class A: 4 def func(self):print('in A') 5 class C(B,A):pass #多继承,继承了B跟A 6 C().func() #B().func 7 # 结果:in B
# 补充:
# object类 类祖宗
# 所有在python3当中的类都是继承object类的
# object中有init
# 所有的类都默认的继承object
# class A(object):
# pass
# a = A()
# 开空间
# 调用init