栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python面向对象之继承

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python面向对象之继承

Python面向对象之继承
      • 继承的概念
        • 单继承
          • 语法
        • 多继承
          • 语法
        • 子类重写父类同名方法和属性
        • 子类调用父类的同名方法和属性
        • 多层继承
        • 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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/876484.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号