一、继承
Python⾯向对象的继承指的是多个类之间的所属关系,即⼦类默认继承⽗类的所有属性和⽅法。
继承作用:继承可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
在Python中,所有类默认继承object类,object类是顶级类或基类;其他⼦类叫做派⽣类。
class Being: # 定义一个类Being
def __init__(self): #初始化实例属性
self.num = 1 #在类里面添加实例属性self.属性名=值
def info_print(self): # 定义一个实例方法
print(self.num) # 在类里面访问实例属性self.属性名
class People(Being): # 定义一个类People,继承Being类
pass
p1 = People() # 创建People类的一个对象p1
p1.info_print() # 对象调用父类实例方法
p1.num # 对象访问父类实例属性
输出:1
class Being(object):
def __init__(self):
self.num = 1
def info_print(self):
print(self.num)
class People(Being):
pass
p1 = People()
p1.info_print()
输出:1
二、单继承
单继承:一个子类继承一个父类
class Master:
def __init__(self):
self.kongfu = "古法配方"
def make_cake(self):
print("{}制作煎饼果子".format(self.kongfu))
class prentice(Master):
pass
daqiu = prentice()
print(daqiu.kongfu)
daqiu.make_cake()
输出:
古法配方
古法配方制作煎饼果子
二、多继承
多继承:一个子类同时继承多个⽗类
当⼀个类有多个父类的时候,默认使用第⼀个父类的同名属性和方法。
class Master:
def __init__(self):
self.kongfu = "古法配方"
self.age = 100
def make_cake(self):
print("{}制作煎饼果子".format(self.kongfu))
class School:
def __init__(self):
self.kongfu = "学校技术"
self.name = "新东方"
def make_cake(self):
print("{}制作煎饼果子".format(self.kongfu))
class prentice(Master, School):
pass
daqiu = prentice()
print(daqiu.kongfu) # 同名属性,访问第一个父类的同名属性
daqiu.make_cake() # 同名方法,访问第一个父类的同名方法
print(daqiu.age) # 不同名属性,第一个父类正常
print(daqiu.name) # 不同名属性,非第一个父类报错
输出:
三、子类重写父类同名方法和属性
⼦类和父类具有同名属性和方法,默认使用子类的同名属性和方法。
class Master:
def __init__(self):
self.kongfu = "古法配方"
self.age = 100
def make_cake(self):
print("{}制作煎饼果子".format(self.kongfu))
class School:
def __init__(self):
self.kongfu = "学校技术"
self.name = "新东方"
def make_cake(self):
print("{}制作煎饼果子".format(self.kongfu))
class prentice(Master, School):
def __init__(self):
self.kongfu = "独创配方"
def make_cake(self):
print("{}制作煎饼果子".format(self.kongfu))
daqiu = prentice()
print(daqiu.kongfu) # 同名属性,重写父类
daqiu.make_cake() # 同名方法,重写父类
#如果子类和父类有同名属性和方法,子类创建对象调用属性和方法,调用的是子类里面的同名属性和方法
# print(daqiu.age) # 不同名属性,报错
print(daqiu.name) # 不同名属性,报错
输出:
四、___mro___
Python的MRO即Method Resolution Order(方法解析顺序),即在调用方法时,会对当前类以及所有的基类进行一个搜索,以确定该方法之所在,而这个搜索的顺序就是MRO。
类名.__mro__,返回一个元组。
可以清晰地看到类的层级关系。
class Master:
def __init__(self):
self.kongfu = "古法配方"
self.age = 100
def make_cake(self):
print("{}制作煎饼果子".format(self.kongfu))
class School(Master):
def __init__(self):
self.kongfu = "学校技术"
self.name = "新东方"
def make_cake(self):
print("{}制作煎饼果子".format(self.kongfu))
class prentice<