Python-继承

一、继承的概念


Python面向对象的继承指的是多个类之间的所属关系,即子类默认继承父类的属性和方法

# 父类A 
class A(object): 
    def __init__(self): 
        self.num = 1 
    def info_print(self): 
        print(self.num) 

# 子类B 
class B(A): 
    pass 

# 创建对象,验证结论 
result = B() 
result.info_print() # 1

在Python中,所有类默认继承object类,object类是顶级类或基类;其他子类叫做派生类

二、单继承


  • 逍遥派掌门人无崖子决定在离世之前将一身绝学传给虚竹
  • 分析:徒弟是不是要继承师父的所有武功?
# 1. 师父类 
class Master(object): 
      def __init__(self): 
            self.kongfu = '[北冥神功]' 
      def beiming(self): 
            print(f'虚竹运用{self.kongfu}击败敌人') 

# 2. 徒弟类 
class Prentice(Master): 
      pass # 

3. 创建对象
xuzhu xuzhu = Prentice() 

# 4. 对象访问实例属性 
print(xuzhu.kongfu) 

# 5. 对象调用实例方法 
xuzhu.beiming()  # 虚竹运用[北冥神功]击败敌人

三、多继承


所谓多继承意思就是一个类同时继承了多个父类

  • 虚竹在继承无崖子功力之前,曾是少林寺僧人,会些许少林武功
class XiaoYao(object): 
      def __init__(self): 
            self.wugong = '[北冥神功]' 
      def kongfu(self): 
            print(f'运用{self.wugong}击败敌人') 

# 少林武功 
class ShaoLin(object): 
      def __init__(self): 
            self.wugong = '[波若掌]' 
      def kongfu(self): 
            print(f'运用{self.wugong}击败敌人')
class Prentice(ShaoLin, XiaoYao): 
      pass 
xuzhu = Prentice() 
print(xuzhu.wugong) 
xuzhu.kongfu() # 运用[波若掌]击败敌人

注意:当一个类有多个父类的时候,默认使用第一个父类的同名属性和方法。

四、子类重写父类同名方法和属性


  • 虚竹潜心修炼自创逍遥游
    class XiaoYao(object): 
        def __init__(self): 
              self.wugong = '[北冥神功]' 
        def kongfu(self): 
              print(f'运用{self.wugong}击败敌人') 
    # 少林武功 
    class ShaoLin(object): 
          def __init__(self): 
                self.wugong = '[波若掌]' 
          def kongfu(self): 
                print(f'运用{self.wugong}击败敌人') 
    class Prentice(ShaoLin, XiaoYao): 
          def __init__(self): 
                self.wugong = '[逍遥游]' 
          def kongfu(self): 
                print(f'运用{self.wugong}击败敌人') 
    
    xuzhu = Prentice() 
    print(xuzhu.wugong) 
    xuzhu.kongfu() # 运用[逍遥游]击败敌人 
    
    print(Prentice.__mro__) # 查看一个类继承的父类以及层级关系
    
    子类和父类具有同名属性和方法,默认使用子类的同名属性和方法。

五、子类调用父类的同名方法和属性


  • 乔峰想要领教一下三弟虚竹的武功,于是虚竹使出了浑身解数
    # 逍遥派武功 
    class XiaoYao(object): 
          def __init__(self): 
                self.wugong = '[北冥神功]' 
          def kongfu(self): 
                print(f'运用{self.wugong}击败敌人') 
    # 少林武功 
    class ShaoLin(object): 
          def __init__(self): 
                self.wugong = '[波若掌]' 
          def kongfu(self): 
                print(f'运用{self.wugong}击败敌人') 
    
    class Prentice(ShaoLin, XiaoYao): 
          def __init__(self): 
                self.wugong = '[逍遥游]' 
          def kongfu(self): 
                self.__init__() 
                print(f'运用{self.wugong}击败敌人') 
          def xiaoyao_kongfu(self): 
                XiaoYao.__init__(self) 
                XiaoYao.kongfu(self) 
          def shaolin_kongfu(self): 
                ShaoLin.__init__(self) 
                ShaoLin.kongfu(self) 
    xuzhu = Prentice() 
    # print(xuzhu.wugong) 
    # xuzhu.kongfu() 
    xuzhu.xiaoyao_kongfu() 
    xuzhu.shaolin_kongfu() 
    xuzhu.kongfu()
    

六、多层继承


  • 多年后虚竹想要将武功再传下去,挑选了一位徒弟
    class XiaoYao(object): 
          def __init__(self): 
                self.wugong = '[北冥神功]' 
          def kongfu(self): 
                print(f'运用{self.wugong}击败敌人')
    class ShaoLin(object): 
          def __init__(self): 
                self.wugong = '[波若掌]' 
          def kongfu(self): 
                print(f'运用{self.wugong}击败敌人') 
    class Prentice(ShaoLin, XiaoYao): 
          def __init__(self): 
                self.wugong = '[逍遥游]' 
          def kongfu(self): 
                self.__init__() 
                print(f'运用{self.wugong}击败敌人') 
          def xiaoyao_kongfu(self): 
                XiaoYao.__init__(self) 
                XiaoYao.kongfu(self) 
          def shaolin_kongfu(self): 
                ShaoLin.__init__(self) 
                ShaoLin.kongfu(self) 
    class TuDi(Prentice): 
          pass 
    tudi = TuDi() 
    tudi.kongfu() 
    tudi.shaolin_kongfu() 
    tudi.xiaoyao_kongfu()
    

七、super()调用父类方法


# 逍遥派武功 
class XiaoYao(object): 
        def __init__(self): 
              self.wugong = '[北冥神功]' 
        def kongfu(self): 
              print(f'运用{self.wugong}击败敌人') 

# 少林武功 
class ShaoLin(XiaoYao): 
        def __init__(self): 
              self.wugong = '[波若掌]' 
        def kongfu(self): 
              print(f'运用{self.wugong}击败敌人') 

              # super()
              # 2.1 带参数 
              # super(ShaoLin,self).__init__() 
              # super(ShaoLin,self).kongfu() 

              #2.2 无参数 
              super().__init__() 
              super().kongfu() 

class Prentice(ShaoLin): 
        def __init__(self): 
              self.wugong = '[逍遥游]' 
        def kongfu(self): 
              self.__init__() 
              print(f'运用{self.wugong}击败敌人') 
        def xiaoyao_kongfu(self): 
              XiaoYao.__init__(self) 
              XiaoYao.kongfu(self) 
        def shaolin_kongfu(self): 
              ShaoLin.__init__(self) 
              ShaoLin.kongfu(self) 
        # 一次性调用两个父类的方法 
        def two_kongfu(self): 
              # 方法一:如果类型修改,这里代码也要修改,而且如果代码量庞大,会很麻烦,几乎都是冗余的 代码 
              # XiaoYao.__init__(self) 
              # XiaoYao.kongfu(self) 
              # ShaoLin.__init__(self) 
              # ShaoLin.kongfu(self) 
  
              # 方法二:super() 
              # 2.1、super(当前类名,self).函数() 
              # super(Prentice,self).__init__() 
              # super(Prentice,self).kongfu() 

              # 2.2、super() 无参数 
              super().__init__() 
              super().kongfu() 
  xuzhu = Prentice() 
  xuzhu.two_kongfu()

另外,子类的对象属性不能超过其各个父类属性个数的最大值,如果不同父类有不同的属性定义,子类
需要全部继承时,需要使用args,*kwargs不定长参数使父类的属性个数不定长,此时子类继承时能
获得所有的属性。

class XiaoYao(object): 
        def __init__(self,*args,**kwargs): 
              self.wugong = '[北冥神功]' 
              self.music = '[达拉崩吧]' 
              super().__init__(*args,**kwargs) 

        def kongfu(self):
              print(f'运用{self.wugong}击败敌人')
  # 少林武功 
  class ShaoLin(object): 
        def __init__(self,*args,**kwargs): 
                self.wugong = '[波若掌]' 
                super().__init__(*args,**kwargs) 

        def kongfu(self): 
                print(f'运用{self.wugong}击败敌人') 
  
  class Prentice(ShaoLin, XiaoYao): 
        def __init__(self): 
              super().__init__() 
  xuzhu = Prentice() 
  print(xuzhu.wugong) 
  print(xuzhu.music)

八、私有权限


8.1 定义私有属性和私有方法

在Python中,可以为实例属性和方法设置私有权限,即设置某个实例属性或实例方法不继承给子类。
设置私有权限的方法:在属性名和方法名 前面 加上两个下划线 __。

  • 虚竹临终前,不想把自己的钱给徒弟
    class XiaoYao(object): 
          def __init__(self): 
                self.wugong = '[北冥神功]' 
    
          def kongfu(self): 
                print(f'运用{self.wugong}击败敌人') 
    
    class ShaoLin(object): 
          def __init__(self): 
                self.wugong = '[波若掌]' 
          def kongfu(self): 
                print(f'运用{self.wugong}击败敌人') 
    
    class Prentice(ShaoLin, XiaoYao): 
          def __init__(self): 
                self.wugong = '[逍遥游]' 
                self.__money = 200000 
          def kongfu(self): 
                self.__init__() 
                print(f'运用{self.wugong}击败敌人') 
          def __info_print(self):
                print("私有方法")
    class TuDi(Prentice): 
          pass 
    tudi = TuDi() print(tudi.__money) # 报错 
    tudi.__info_print() # 报错
    
    注意:稀有属性和私有方法只能在类里面访问和修改
8.2 获取和修改私有属性值
class XiaoYao(object): 
      def __init__(self): 
            self.wugong = '[北冥神功]' 

      def kongfu(self): 
            print(f'运用{self.wugong}击败敌人') 
class ShaoLin(object): 
      def __init__(self): 
            self.wugong = '[波若掌]' 
      def kongfu(self): 
            print(f'运用{self.wugong}击败敌人') 

class Prentice(ShaoLin, XiaoYao): 
      def __init__(self): 
            self.wugong = '[逍遥游]' 
            self.__money = 200000 
      def kongfu(self): 
            self.__init__() 
            print(f'运用{self.wugong}击败敌人') 
      # 获取私有属性 
      def get_money(self): 
            return self.__money 
      # 修改私有属性 
      def set_money(self): 
            self.__money = 500 
      def __info_print(self): 
            print('私有方法') 
class TuDi(Prentice): 
      pass 
tudi = TuDi()
print(tudi.get_money()) 
tudi.set_money() 
print(tudi.get_money())
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351