- 继承的概念
- 单继承
- 语法
- 多继承
- 语法
- 子类重写父类同名方法和属性
- 子类调用父类的同名方法和属性
- 多层继承
- super()调用父类方法
- __mro__属性
- super()
- 私有权限
- 定义私有属性和方法
- 获取和修改私有属性值
生活中的继承,一般指的是子女继承父辈的财产。
Python面向对象的继承指的是多个类之间的所属关系,即子类默认继承父类的所有属性和方法。
单继承- 一个子类只继承一个父类。子类默认继承父类的所有属性和方法。
class SubClass(ParentClass):
代码块
- SubClass继承ParentClass所有的属性与方法
- python里所有类默认继承object类。
如:
# 父类Animal
class Animal:
def __init__(self):
self.headnum =1
self.legnum=4
def info_print(self):
print(f"动物:{self.headnum}个头,{self.legnum}条腿")
# 子类Cat
class Cat(Animal):
pass
mycat=Cat()
mycat.info_print()
#1个头,4条腿
多继承
- 一个子类继承多个父类。子类默认继承所有父类的属性和方法,同名属性/方法使用第一个拥有该属性/方法的父类的属性/方法。
- 先到先得
class subclass(parentclass1,parentclass2...):
代码块
如:
# 父类Animal
class Animal:
def __init__(self):
self.headnum =1
self.legnum=4
def info_print(self):
print(f"动物:{self.headnum}个头,{self.legnum}条腿")
#父类Pet
class Pet:
def __init__(self):
self.headnum =1
self.legnum=2
def info_print(self):
print(f"宠物:{self.headnum}个头,{self.legnum}条腿")
def run(self):
print(f"{self.name}欢快地跑了过来")
# 子类Cat
class Cat(Animal,Pet):
pass
mycat=Cat()
mycat.name="毛球"
mycat.info_print() #Animal的headnum,legnum,info_print()
mycat.run() #Pet的name,run()
"""
动物:1个头,4条腿
毛球欢快地跑了过来
"""
子类重写父类同名方法和属性
- 子类和父类具有同名属性和方法,默认使用子类的同名属性和方法。
- 子改父业
如:
# 父类Animal
class Animal:
def __init__(self):
self.headnum =1
self.legnum=4
def info_print(self):
print(f"动物:{self.headnum}个头,{self.legnum}条腿")
# 子类Bird
class Bird(Animal):
def __init__(self):
self.headnum=1
self.legnum=2
def info_print(self):
print(f"鸟:{self.headnum}个头,{self.legnum}条腿")
mybird=Bird()
mybird.info_print() #Bird的headnum,legnum,info_print()
#鸟:1个头,2条腿
子类调用父类的同名方法和属性
- 需要在子类中编写相应接口,才能间接调用父类的同名方法和属性。
class parentclass():
def __init__(self):
self.attribute=var1;
def method(self):
代码块1
class subclass(parentclass):
def __init__(self):
self.attribute=var2;
def method(self): #子类自己的方法
self.__init__(self) #确保是子类自己的属性
代码块2
def parent_method(self): #间接使用父类的同名方法
parentclass.__init__(self) #调用父类的__init__(),获取父类同名属性
Animal.method()
如:
# 父类Animal
class Animal:
def __init__(self):
self.headnum =1
self.legnum=4
def info_print(self):
print(f"动物:{self.headnum}个头,{self.legnum}条腿")
# 子类Bird
class Bird(Animal):
def __init__(self):
self.headnum=1
self.legnum=2
def info_print(self):
self.__init__(self)
print(f"鸟:{self.headnum}个头,{self.legnum}条腿")
def parent_info_print(self):
Animal.__init__(self)
Animal.info_print(self)
mybird=Bird()
mybird.info_print() #Bird的headnum,legnum,info_print()
#鸟:1个头,2条腿
mybird.parent_info_print() #Aniaml的headnum,legnum,info_print()
#动物:1个头,4条腿
多层继承
- 模拟现实中的多层所属关系。子类有父类,父类也可以有自己的父类,以此类推,这时子类继承父类,相当于继承了一系列祖宗类。
如:
# 父类的父类Animal
class Animal:
def __init__(self,headnum,legnum):
self.headnum =headnum
self.legnum=legnum
def info_print(self):
print(f"动物:{self.headnum}个头,{self.legnum}条腿")
# 父类Bird
class Bird(Animal):
def __init__(self):
self.headnum=1
self.legnum=2
def fly(self):
print("振动翅膀,起飞!")
#子类BirdPet
class BirdPet(Bird):
def __init__(self):
self.headnum =headnum
self.legnum=legnum
def welcome(self):
print("小鸟在飞,绕着你打转...")
mybird=BirdPet()
mybird.info_print() #Animal类的方法
mybird.fly() #Bird类的方法
mybird.welcome() #BirdPet的方法
"""
动物:1个头,2条腿
振动翅膀,起飞!
小鸟在飞,绕着你打转...
"""
super()调用父类方法
__mro__属性
- method resolution order的简称,即方法解析顺序。
- object类中的一个属性,因此被所有类继承
- 返回一个顺序序列,从左到右查找优先级降低。
- 当调用子类的方法或访问子类的属性时,解释器将对mro中的类一一检索是否含有该方法/属性。因此,若属性/方法重名,默认访问/调用mro中先出现的类的同名方法/属性。
如:
# 父类的父类Animal
class Animal():
def info(self):
print(f"动物")
#父类Pet
class Pet():
def info(self):
print("宠物")
# 子类Bird
class Bird(Animal,Pet):
pass
print(Bird.__mro__)
#(, , , )
#故Bird.info(),实际上调用的是从左往右第一个有该方法的Animal的info()
Bird.info_print()
#动物
super()
super(className,objectName).method()
class parentclass():
def parentmethod(self):
代码块1
class subclass(parentclass):
super(subclass,self).parentmethod()
#super().parentmethod()
- super(className,objectName).method() 指的是在对象objectName的__mro__序列内找到类className右侧第一个含有方法method()的类,调用该类的method方法。
- 故super(subclass,self).parentmethod() 能够自动查找并调用subclass 的父类的方法parentmethod()(第一个拥有该方法的父类)
- subclass,self可不写,则默认调用该类的父类的方法。
- 常用于单继承
如:
class Person():
def introduce(self):
print("我是个人")
class Student(Person):
def introduce(self):
super().introduce()
print("我是个学生")
a=Student()
a.introduce()
私有权限
定义私有属性和方法
-
在Python中,可以为属性和方法设置私有权限,即设置某个属性或方法不会继承给子类,也不能够在类外访问调用到
-
私有属性只能在类内修改,可以通过公有方法提供获取、修改的接口
-
私有方法只能在类内部发挥作用
-
设置私有权限的方法:在属性名和方法名 前面 加上两个下划线 __
如:
class Father():
money=100000
__name="张三"
def __lawchallenge(self):
print("法外狂徒")
def knowluo(self):
print("认识罗翔老师")
class Son(Father):
pass
son=Son()
print(son.money) #100000
print(son.__name)
#报错,'Son' object has no attribute '__name'
#无法继承私有属性
son.knowluo()
#认识罗翔老师
son.__lawchallenge()
#报错,'Son' object has no attribute '__lawchallenge
#无法继承私有方法
father=Father()
print(father.__name)
#'Father' object has no attribute '__name'
father.__lawchallenge()
#'Son' object has no attribute '__lawchallenge'
#私有属性,私有方法无法在类外部访问调用
获取和修改私有属性值
- 在Python中,一般定义函数名get_xx用来获取私有属性,定义set_xx用来修改私有属性值。
class Person():
__age=0
def set_age(self,age):
__age=age
def get_age(self):
return self.__age
myself=Person()
print(myself.__age)
#报错,'Person' object has no attribute '__age'
myself.set_age(18)
print(myself.get_age())
#18



