python面向对象之继承相关知识
1、继承
继承描述的是多个类之间的所属关系。通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类
2、单继承(子类只继承一个父类)
子类在继承的时候,在定义类时,小括号中为父类的名字。父类的属性和方法都会被继承给子类
示例
# 任何类都可以是父类,因此语法与创建任何其他类相同
class Parent:
def __init__(self,name):
self.name = name
def info(self):
print(f"小明向{self.name}借了5元钱")
# 定义Child类,继承了Parent,则Child是子类,Parent是父类
class Child(Parent):
# 子类可以继承父类所有的属性和方法,即使子类没有自己的属性和方法,也可以使用父类的
pass
# 创建子类实例对象
c = Child("小红")
# 子类对象可以直接使用父类的方法
c.info()
运行结果:
3、多继承(子类继承多个父类)
子类会继承所有父类的属性和方法。
说明:如果多个父类中有同名的属性和方法,则默认使用第一个父类的属性和方法。多个父类中,不重名的属性和方法,不会有任何影响
示例
class Parent:
def __init__(self,name):
self.name = name
def info(self):
print(f"小明向{self.name}借了5元钱")
def mood(self):
print("借到钱了真开心")
class Bank:
def __init__(self,name):
self.bankname = name
def info(self):
print(f"小明向{self.bankname}申请了贷款")
def hint(self):
print("记得还钱")
# 多继承,继承了多个父类
class Child(Bank,Parent):
pass
c = Child("中国银行")
c.info()
c.mood()
c.hint()
运行结果:
4、方法重写
如果父类方法的功能不能满足需求,可以在子类重写父类的同名属性或方法
说明:若子类和父类有同名的属性或方法,则默认使用子类的
示例
class Parent:
def __init__(self):
self.name = "小红"
def info(self):
print("小明向%s借了钱" % self.name)
class Child(Parent):
def __init__(self):
self.name = "小强"
def info(self):
print("小明没有向%s借钱" % self.name)
c = Child()
print(c.name) # 子类和父类有同名的属性,则默认使用子类的
c.info() # 子类和父类有同名的方法,则默认使用子类的
运行结果:
5、子类调用父类同名的属性和方法
示例
class Parent:
def __init__(self):
self.name = "小红"
def info(self):
print("小明向%s借了钱" % self.name)
class Child(Parent):
def __init__(self):
self.name = "小强"
def info(self):
print("小明没有还%s的钱" % self.name)
def parent_info(self):
# 调用父类方法的格式为:父类名.父类方法(self)
Parent.__init__(self) # 调用父类的__init__方法来修改self的属性值
print("小明没有还%s的钱" % self.name)
Parent.info(self) # 调用父类的实例方法
# 实例化对象,自动执行子类的__init__方法
c = Child()
c.info()
c.parent_info()
运行结果:
6、多层继承
示例
class Parent:
def __init__(self):
self.name = "小红"
print(f"小明向{self.name}借了钱")
def mood(self):
print("借到钱了真开心")
class Applic:
def __init__(self):
self.name = "借钱APP"
print(f"小明向{self.name}借了钱")
def hint(self):
print("记得还钱")
# 多继承,继承了多个父类
class Child(Applic,Parent):
def __init__(self):
self.name = "小强"
print(f"小明向{self.name}借了钱")
def info(self):
print("小明想借钱买游戏机")
# 多层继承
class NewChild(Child):
pass
nc = NewChild()
nc.info()
nc.mood()
nc.hint()
运行结果:
7、super() 函数
super() 函数会使子类从其父继承所有方法和属性。通过使用 super() 函数,不必使用父元素的名称,它将自动从其父元素继承方法和属性
说明:使用 super() 函数,如果涉及到多继承,该函数只能调用第一个直接父类的构造方法
示例
class Parent:
def __init__(self):
self.name = "小红"
self.money = "500"
def info(self):
print(f"小明向{self.name}借了{self.money}")
def mood(self):
print("借到钱了真开心")
class Child(Parent):
def __init__(self):
self.name = "小强"
self.money = 700
def info(self):
self.__init__() # 执行本类的__init__方法,做属性初始化
print(f"小明向{self.name}借了{self.money}")
def parent_info(self):
super().__init__() # 执行父类的__init__方法
print("小明没有还%s的钱" % self.name)
super().info() # 执行父类的实例方法
self.info() # 执行本类的实例方法
c = Child()
c.info()
print("------------------------")
c.parent_info()
运行结果: