Python基础笔记7-简说继承-面向对象part2


温馨提示:手机观看时,代码块可以左右滑动

继承

  • 如果在子类中定义了__init__()方法,父类的__init__() 不会被自动调用,需要在子类中显示调用

  • 子类中调用父类方法时,以父类类名为前缀,并以self做为第一个参数.区别于在类中调用普通函数是不需要带上self参数

  • Python总是首先在子类中查找对应方法,如果子类中没有找到,才会找到父类中逐个查找

    单继承

  • 当我们定义了一个类A,还需要建立一个B,但是A和B两者属性大致相同。那么可以利用继承的方法,让B继承A的属性,而不是重头开始写个B。

class University():
    def __init__(self):
        self.level = '双一流大学'
        print("University:yes")
    def getLevel(self):
        print('University:self level is:',self.level)

class College(University):
    pass

a = University()   # 返回University:yes
a.getLevel()       # 返回University:self level is: 双一流大学
b = College()      # 返回University:yes
b.getLevel()       # 返回University:self level is: 双一流大学

#在这个例子中,子类College默认没有__init__属性时,会直接继承父类University的__init__
#如果子类中有定义__init__,子类必须显示地在__init__()函数中再次调用父类的__init__()函数。

继承与抽象

  • 继承是基于抽象的过程
  • 以下是大学里建立教职工与学员信息表的代码,如下:
class Teachers():   #建立教职工的类
    def __init__(self,name,age,tea_id):
        self.name = name
        self.age = age
        self.tea_id = tea_id
    def say_hello(self):
        print('My name is {},{} years old'.format(self.name,self.age))
        print('I am a teacher,my id is {}'.format(self.tea_id))

class Students():   #建立学生的类
    def __init__(self,name,age,stu_id):
        self.name = name
        self.age = age
        self.stu_id = stu_id
    def say_hello(self):
        print('My name is {},{} years old'.format(self.name,self.age))
        print('I am a student,my id is {}'.format(self.stu_id))
  • Students和Teachers类都有共同的属性name和age,并且say_hello方式相同,可以对他们进行抽象,归类为People,建立派生类Sudents和Teachers。代码如下:
class People:
    def __init__(self,name,age,id):
        self.name = name
        self.age = age
        self.id = id
    def say_hello(self):
        print('My name is %s,%s years old'%(self.name,self.age))
        print('My id is %s'%self.id)

class Students(People):
    pass

class Teachers(People):
    pass

p = Students('amy','18','o090909')
q = Teachers('john','22','i090979')

p.say_hello()
#返回结果如下:
# My name is amy,18 years old
# My id is o090909

q.say_hello()
#返回结果如下:
# My name is john,22 years old
# My id is i090979

覆盖

  • 现在需要解决的就是要区分出是老师还是学生
  • 思路:
    • 覆盖People中的say_hello方法
    • Students调用say_hello方法时多输出一句"I am a student",同理Teachers类多输出一句"i am a teacher"
  • 调整后代码如下:
class People:
    def __init__(self,name,age,id):
        self.name = name
        self.age = age
        self.id = id
    def say_hello(self):
        print('My name is %s,%s years old'%(self.name,self.age))
        print('My id is %s'%self.id)

class Students(People):
    def say_hello(self):
        People.say_hello(self) #调用父类方法
        print('I am a student') 

class Teachers(People):
    def say_hello(self):
        People.say_hello(self) #调用父类方法
        print('I am a teacher')
        
p = Students('amy','18','o090909')
q = Teachers('john','22','i090979')

p.say_hello()
#返回结果如下:
# My name is amy,18 years old
# My id is o090909
# I am a student

q.say_hello()
#返回结果如下:
# My name is john,22 years old
# My id is i090979
# I am a teacher

多重继承

  • 子类可以继承多个父类
class Father1():
    father1_data = 'this is father_1'
    def father_1(self):
        return 'this is father_1 def'

class Father2():
    father2_data = 'this is father_2'
    def father_2(self):
        return 'this is father_2 def'

class Son(Father1,Father2):#子类Son同时继承Father1和Fahter2类
    def son_def(self):
        return 'this is son def'

s = Son()
print(s.father1_data) # 返回this is father_1
print(s.father2_data) # 返回this is father_2
s.father_1()  # 返回'this is father_1 def'
s.father_2()  # 返回'this is father_2 def'

上一篇:Python基础笔记6-那些被遗忘又好用的函数
下一篇:敬请期待

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

推荐阅读更多精彩内容