Python面向对象-类的继承

继承是面向对象的重要特性之一,作为面向对象的Python,接下来让我们探讨一下Python的继承机制

为什么继承?

减少代码的重复性,提高代码的复用性

能继承什么?
  • 公有属性
  • 公有方法
怎么继承?

了解了python中类的基础知识后,让我们看一下神奇的继承机制
python中继承的基本格式如下:

#父类
class superClassName:
    pass

#子类
class subClassName(superClassName):
    pass

子类需要继承父类的构造方法时,必须显示的调用,并传递参数 self

# -*- coding: utf-8 -*-
class People:
    
    def __init__(self, name, age):
        self.__name = name
        self.__age = age
    
    def getName(self):
        return self.__name

    def getAge(self):
        return self.__age

class Xiaonan(People):
    
    def __init__(self, name, age):
        #注意要显示调用父类构造方法,并传递参数self
        People.__init__(self, name, age)

xn = Xiaonan('xioaonan', 20)
print xn.getName()  #xiaonan
print xn.getAge()   #20

需要注意的有以下几点:

  1. 如果父类和子类都重新定义了构造方法__init()__,子类实例化时,子类的构造方法不会自动调用父类的构造方法,必须在子类中显示调用。
  2. 如果需要在子类中调用父类的方法,需要以 "父类名.方法" 这种方式调用,以这种方式调用的时候,注意要传递self参数过去。
# -*- coding: utf-8 -*-
class People:

    def __init__(self, name, age):
        self.__name = name
        self.__age = age
    
    def getName(self):
        return self.__name

    def getAge(self):
        return self.__age

    def Miss(self):
        print "I miss you in People"

class Xiaonan(People):
    
    def __init__(self, name, age):
        People.__init__(self, name, age)

    def InSub(self):
        People.Miss()

xn = Xiaonan('xioaonan', 20)
print xn.getName()
print xn.getAge()
xn.InSub()

运行结果为:

xioaonan
20
Traceback (most recent call last):
  File "test.py", line 28, in <module>
    xn.InSub()
  File "test.py", line 23, in InSub
    People.Miss()
TypeError: unbound method Miss() must be called with People instance as first argument (got nothing instead)
  1. 子类继承了父类所有的公有属性和方法,可以在子类中通过父类名来调用,而对于私有的属性和方法,子类是不进行继承的,因此在子类中是无法通过父类名来访问的。
# -*- coding: utf-8 -*-
class People:

    height = 170
    __money = 10
    
    def __init__(self, name, age):
        self.__name = name
        self.__age = age
    
    def getName(self):
        return self.__name

    def getAge(self):
        return self.__age

    def Miss(self):
        print "I miss you in People"
    
    def __say(self):
        print "I can say in People"

class Xiaonan(People):
    
    def __init__(self, name, age):
        People.__init__(self, name, age)

    def InSub(self):
        print People.height
        People.Miss(self)
        print People.__money
        # People.__say(self)

xn = Xiaonan('xioaonan', 20)
print xn.getName()
print xn.getAge()
xn.InSub()

运行结果为:

xioaonan
20
170
I miss you in People
Traceback (most recent call last):
  File "test.py", line 37, in <module>
    xn.InSub()
  File "test.py", line 31, in InSub
    print People.__money
AttributeError: class People has no attribute '_Xiaonan__money'

print People.__money 这一行注释,下面一行打开时,同样的报错类型:

Traceback (most recent call last):
  File "ss1.py", line 37, in <module>
    xn.InSub()
  File "ss1.py", line 32, in InSub
    People.__say(self)
AttributeError: class People has no attribute '_Xiaonan__say'

python 支持多重继承

# -*- coding: utf-8 -*-
class People:
    
    def __init__(self, name, age):
        self.__name = name
        self.__age = age
    
    def getName(self):
        return self.__name

    def getAge(self):
        return self.__age

class Student:
    
    def __init__(self, className, sno):
        self.className = className
        self.sno = sno
    
    def getClass(self):
        return self.className
        
    def getSno(self):
        return self.sno
    
class Xiaonan(People, Student):
    
    def __init__(self, name, age, className, sno):
        People.__init__(self, name, age)
        Student. __init__(self, className, sno)
        self.money = 100

xn = Xiaonan('xioaonan', 20, '软件班', 201158761)
print xn.getName()  #xiaonan
print xn.getSno()   #201158761
print xn.money      #100

多重继承始终以第一个父类中为中心:

  1. 当子类中未申明构造方法时,将自动调用第一个父类的构造方法
# -*- coding: utf-8 -*-
class People:
    
    def __init__(self, name, age):
        self.__name = name
        self.__age = age
    
    def getName(self):
        return self.__name

    def getAge(self):
        return self.__age

    def eat(self):
        print 'I am having lunch'

class Student:
    
    def __init__(self, className, sno):
        self.className = className
        self.sno = sno
    
    def getClass(self):
        return self.className
        
    def getSno(self):
        return self.sno

    def eat(self):
        print 'I am having dinner'
    
class Xiaonan(People, Student):

    money = 100
    
xn = Xiaonan('xioaonan', 20)
print xn.getName()
print xn.getClass()

运行结果:

xioaonan
Traceback (most recent call last):
  File "test.py", line 38, in <module>
    print xn.getClass()
  File "test.py", line 24, in getClass
    return self.className
AttributeError: Xiaonan instance has no attribute 'className'

不难看出,的确调用的是第一个父类的构造方法

  1. 若多个父类中有含有同名的方法时,通过子类的实例化对象调用该方法,则调用的是第一个父类的该方法
# -*- coding: utf-8 -*-
class People:
    
    def __init__(self, name, age):
        self.__name = name
        self.__age = age
    
    def getName(self):
        return self.__name

    def getAge(self):
        return self.__age

    def eat(self):
        print 'I am having lunch'

class Student:
    
    def __init__(self, className, sno):
        self.className = className
        self.sno = sno
    
    def getClass(self):
        return self.className
        
    def getSno(self):
        return self.sno

    def eat(self):
        print 'I am having dinner'
    
class Xiaonan(People, Student):

    money = 100

xn = Xiaonan('xioaonan', 20)
print xn.eat()

运行结果为

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

推荐阅读更多精彩内容