类继承

继承是相对两个类而言的父子关系,在Python中,可以让一个类去继承一个类,被继承的类称为父类或者超类、也可以称作基类,继承的类称为子类。并且Python支持多继承,能够让一个子类有多个父类。在定义一个类的时候,可以在类名后面紧跟一对括号,在括号中指定所继承的父类,如果有多个父类,多个父类名之间用逗号隔开。

在Python中,同时支持单继承与多继承,语法如下:

class SubClassName(ParentClass1 [,ParentClass2, ...]):

class_suite

通过继承,子类实例同样也是父类的实例。

子类继承了父类什么

如下一个继承关系

class Person:

   """this is father"""

   country="earth";                                        #类变量

   def __init__(self,namepara,agepara):                #实例属性一般通过__init__方法初始化

        self.name=namepara                     #初始化self.name,即成员变量name

        self.age=agepara

                                       

   def selfmethod(self):

        print("my name is"+self.name)                

   

   @classmethod

   def clsmethod(cls):

        print("father's classmethod")

 

class SubPerson(Person):                       #继承父类Person

       

   def subselfmethod(self):                                #重写父类的innerfun方法

        print ("SubPerson's instancemethod")

   @classmethod

   def subclsmethod(cls):

        print("subclass's method")

         使用dir函数查看一下各类的属性

>>> dir(Person)

['__class__', '__delattr__','__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__','__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__','__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__','__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__','__subclasshook__', '__weakref__','clsmethod',

'country', 'selfmethod']

>>> dir(SubPerson)

['__class__', '__delattr__','__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__','__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__','__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__','__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__','__subclasshook__', '__weakref__','clsmethod',

'country', 'selfmethod', 'subclsmethod', 'subselfmethod']

>>> 

可见,对于继承关系,子类继承了父类所有的类数据属性和方法属性。__init__()方法也只是一个普通的实例方法,继承发生的时候,父类的__init__方法也会被继承。

因为类中同名的方法或类属性将覆盖类中排在其上面的同名方法或类属性,所以如果子类中定义了同名方法(无论是重写或重载),子类都将无法使用父类中的方法。

如改写SubPerson类为

classSubPerson(Person):                       #继承父类Person

   

    country="china"

    def __init__(self, sex):             #

       self.sex = sex

       

    def subselfmethod(self):                              

        print ("SubPerson's instancemethod")

    @classmethod

    def subclsmethod(cls):

        print("subclass's method")

   

    def selfmethod(self,otherpara):

        print("overload father'sinstancemethod "+otherpara)

   

    @classmethod

    def clsmethod(cls):

        print("overwrite father's classmethod")

测试结果有

>>>sp=SubPerson('m')

>>>sp.selfmethod()

Traceback(most recent call last):

  File "", line 1, in

TypeError:selfmethod() missing 1 required positional argument: 'otherpara'

>>>

>>>sp.clsmethod()

overwritefather's class method

>>>sp.country

'china'

>>> 


文档字符串对于类、函数/方法,以及模块来说是唯一的,也就是说doc属性是不能从父类中继承来的。如

>>>Person.__doc__

'this isfather'

>>>SubPerson.__doc__

>>> 


单继承中调用父类方法

如上所述,子类中同名的方法会覆盖父类中的同名方法,如果子类想要继承父类方法体的同时,并扩展该方法体,这就需要在子类方法中显式调用父类的方法。

子类调用父类的方法的方式有两种:

1、父类名.父类方法名(参数列表)

2、super(子类类名,self).父类方法名(参数列表) 或super().父类方法名(参数列表)

上面第二种方法在python2中的话,你要这样用。在python3里可以这样用super().父类方法名(参数列表)。super的作用是避免硬编码,通过父类名直接访问父类的属性,需要经父类名硬编码到子类中,为了解决这个问题,可以使用Python中的super关键字,super主要来调用父类方法来显式调用父类。

classSubPerson(Person):                      #继承父类Person

   

    country="china"

    def __init__(self, name, age, sex):             #

        Person.__init__(self, name, age)           #显式调用父类初始化方法

        self.sex = sex

       

    def subselfmethod(self):                              

        super().selfmethod()

        print ("SubPerson's instancemethod")

    @classmethod

    def subclsmethod(cls):

        print("subclass's method")

       测试用例

>>>sp=SubPerson('test',20,'m')

>>>sp.subselfmethod()

my name istest

SubPerson'sinstance method

>>> 

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容

  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 2,764评论 0 8
  • 私有化 .属性和方法访问权限私有的:在类的外部不可以被使用,,也不可以被继承保护的:在类的外部不可以被使用,也可以...
    ChiAo1fei阅读 246评论 0 0
  • 初识面向对象 楔子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思考呀,人狗作战...
    go以恒阅读 927评论 0 6
  • 目的是可以代码重用 class DerivedClassName (BassClassName) class Pa...
    theagao阅读 897评论 0 0
  • 最近科创板新基金的发行开始铺天盖地了,我的手机里不下10条营销短信,身边也有很多小伙伴咨询科创的基金能不能买,今天...
    七年蝉龟阅读 353评论 0 1