一、单继承
1、单继承语法
class 类名(父类名):
初始化语句1
初始化语句2
...
2、单继承案例
class Animal:
# 动物的特性
def eat(self):
print("吃")
def drink(self):
print("喝")
def run(self):
print("跑")
def sleep(self):
print("睡")
class Dog(Animal):
def dark(self):
print("汪汪叫")
dog = Dog()
dog.sleep() # 睡
dog.dark() # 汪汪叫
二、多继承
1、多继承语法
# 多继承语法
class A:
...
class B:
...
...
class C(A, B, ...):
...
2、多继承案例
# 多继承语法
class A:
def test(self):
print("test")
class B:
def demo(self):
print("demo")
class C(A, B):
pass # 没想好函数内容时可以使用,使用占位符防止空函数报错
c = C()
c.test() # test
c.demo() # demo
3、多继承注意事项
多继承中,如果类A和类B有同样的方法,尽量避免使用多继承,因为A和B谁的顺序在前,会使用谁的方法
三、继承中的特点
- 如果子类需要父类的构造方法,只能显式调用父类的构造方法,或者不重写父类的构造方法
- 子类继承父类,可以直接享受父类已封装好的方法
- 子类中应该根据职责,封装子类特有的属性和方法
- 先在本类中查找调用的方法,找不到才去父类中找
1、子类不重写父类的__init__,实例化子类,会自动调用父类的__init__
# 子类不重写父类的构造方法
class Father:
def __init__(self, name):
self.name = name
print("name: %s" % self.name)
def getName(self):
return "Father %s" % self.name
class Son(Father):
# 子类重写父类的getName方法
def getName(self):
return "Son %s" % self.name
son = Son("runoob") # init方法创建对象自动调用,所以会打印name: runoob
print(son.getName()) # Son runoob
2、子类重写父类的__init__,实例化子类,会自动调用子类的__init__
# 子类重写父类的构造方法
class Father:
def __init__(self, name):
self.name = name
print("name: %s" % self.name)
def getName(self):
return "Father %s" % self.name
class Son(Father):
# 子类重写父类的构造方法
def __init__(self, name): # 提示 Call to __init__ of super class is missed
self.name = name
print("hi")
# 子类重写父类的getName方法
def getName(self):
return "Son %s" % self.name
son = Son("runoob") # 子类重写父类的构造方法,打印hi
print(son.getName()) # Son runoob
3、如果重写了__init__ 时,使用 super 关键字继承父类的构造方法
# 子类重写父类的构造方法
class Father:
def __init__(self, name):
self.name = name
print("name: %s" % self.name)
def getName(self):
return "Father %s" % self.name
class Son(Father):
# 子类重写父类的构造方法
def __init__(self, name):
# 使用super继承父类构造方法
super().__init__(name)
self.name = name
print("hi")
# 子类重写父类的getName方法
def getName(self):
return "Son %s" % self.name
son = Son("runoob") # 继承父类的构造方法,打印name: runoob hi
print(son.getName()) # Son runoob
4、子类重写父类普通方法,使用 super 关键字继承父类的方法
# 子类重写父类的构造方法
class Father:
def __init__(self, name):
# 创建实例属性
self.name = name
print("name: %s" % self.name)
def getName(self):
# return "Father %s" % self.name
print("父类方法")
class Son(Father):
# 子类重写父类的构造方法
def __init__(self, name):
# 使用super继承父类构造方法
super().__init__(name)
# 创建实例属性
self.name = name
print("hi")
# 子类重写父类的getName
def getName(self):
# 子类方法实现包含父类方法 使用super().父类方法
super().getName()
return "Son %s" % self.name
son = Son("runoob") # 继承父类的构造方法,打印name: runoob hi
print(son.getName()) # 父类方法 Son runoob
疑问:下面这段代码为什么父类中的getName没输出???
# 子类重写父类的构造方法
class Father:
def __init__(self, name):
self.name = name
print("name: %s" % self.name)
def getName(self):
return "Father %s" % self.name
# print("父类方法")
class Son(Father):
# 子类重写父类的构造方法
def __init__(self, name):
# 使用super继承父类构造方法
super().__init__(name)
self.name = name
print("hi")
# 子类重写父类的getName
def getSonName(self):
# 子类方法实现包含父类方法 使用super().父类方法
super().getName()
return "Son %s" % self.name
son = Son("runoob") # 继承父类的构造方法,打印name: runoob hi
print(son.getSonName()) # 为什么父类中的getName没输出???
问题原因是:在子类的 getSonName()
方法中没有将父类的 getName()
方法的输出打印出来。需要在子类的 getSonName()
方法中将super().getName()修改为
print(super().getName())
来输出父类的 getName()
方法。