day23 单继承、多继承、菱形继承、魔术方法__init__
单继承
"""
如果一个类继承另外一个类,
该类叫做子类(衍生类),被继承的类叫做父类(基类,超类)
继承:(1) 单继承 (2) 多继承
在python中,所有的类都默认继承父类object
"""
1 2 3 4 5 6 7 8 9 10 11 12 | class Human( object ): hair = "黑色" sex = " 男" def cry( self ): print ( "人类在伤心的时候,会留下鳄鱼的眼泪" ) def eat( self ): print ( "人类在远古的之后抓到猎物直接吃" ) def __maketool( self ): print ( "人类在没有工具的时候,会制造工具" ) |
子类在继承父类之后,子类可以调用父类的公有成员
1 2 3 4 5 6 | class Man(Human): pass obj = Man() print (obj.hair) obj.cry() |
子父继承之后,子类不能调用父类的私有成员
1 2 3 4 5 6 7 | class WoMan(Human): def pub_func( self ): self .__maketool() obj = WoMan() obj.__maketool() # error obj.pub_func() # error |
子父继承之后,子类可以改写父类中的方法
"""
子父继承之后
如果子类成员里面有该成员属性或者方法,优先调用自己的
如果没有该成员,调用父类中的成员
如果都没有,直接报错
"""
1 2 3 4 5 6 7 8 9 | class Children(Human): sex = " 女性" def cry( self ): print ( "小孩只会哇哇哇的哭" ) obj = Children(Human) obj.cry() print (obj.__dict__) print (Children.__dict__) |
多继承
基本语法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Father(): property = "风流倜傥,一表人才,一直梨花压海棠" def f_hobby( self ): print ( "社会摇,蹦迪,吃喝嫖赌,大保健" ) class Mother(): property = "闭月羞花,倾国倾城,一枝红杏出墙来" def m_hobby( self ): print ( "织毛衣,喂小狗,听音乐" ) class Daughter(Father,Mother): pass # 实例化对象 obj = Daughter() print (obj. property ) obj.m_hobby() |
super用法
"""
(1)super本身是一个类 super()是一个对象 用于调用父类的绑定方法
(2)super() 只应用在绑定方法中,默认自动传递self对象(前提:super所在作用域存在self)
(3)super用途:解决复杂的多继承调用顺序
"""
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | class Father(): property = "风流倜傥,一表人才,一枝梨花压海棠" def f_hobby(): print ( "社会摇,蹦迪,吃喝嫖赌,大保健" ) class Mother(): property = "闭月羞花,倾国倾城,一枝红杏出墙来" def m_hobby( self ): print ( "打麻将,打牌,喝酒抽烟烫头,跳广场舞" ) class Son(Father,Mother): property = "喜欢打游戏,wow,lol,dnf,泡泡堂,cf,dota,大话西游,跑跑卡丁车,吃鸡" 1. 利用类来调用父类的成员 def skill1( self ): Father.f_hobby() print (Mother. property ) 2. 利用对象调用父类的成员 def skill2( self ): self .m_hobby() print ( self . property ) 3. 利用 super 调用父类的属性和方法 """ super()只调用父类的相关公有成员,不会调用自己的本类成员,父类没有直接报错. super()在调用父类方法时,只调用父类的绑定方法,默认传递参数是本类的对象self """ def skill3( self ): # print(super()) print ( super (). property ) super ().m_hobby() # super().f_hobby() error obj = Son() print ( "<===============>" ) obj.skill1() print ( "<===============>" ) obj.skill2() print ( "<===============>" ) obj.skill3() |
"""
self 和 super()的区别
self 在调用成员时,先看看自己的类对象中是否存在该成员,如果有调用自己的,如果没有,调用父类的.如果都没有报错
super() 在调用成员时,只调用父类的相关成员(属性,绑定方法),永远不会调用自己的.如果父类没有,直接报错.
"""
菱形继承 (钻石继承)
"""
Human
Man Woman
Children
"""
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | class OldWoman(): pass class Human(): pty = 4 def feelT( self ): print ( "原始人类如果热了,脱皮1" ) print ( self .pty) print ( "原始人类如果冷了,扒别人的皮2" ) class Man(Human): pty = 3 def feelT( self ): print ( "现代男人如果热了,脱衣服,脱裤子3" ) super ().feelT() print ( "现代男人如果冷了,脱别人的衣服,脱别人的裤子4" ) class Woman(Human): pty = 2 def feelT( self ): print ( "现代女人如果热了,吹空调,吃雪糕5" ) super ().feelT() print ( "现代女人如果冷了,喝热水,用暖宝宝6" ) class Children(Man,Woman): pty = 1 def feelT( self ): print ( "现代小孩如果热了,就哭,嗯哭7" ) super ().feelT() print ( "现代小孩如果冷了,也要哭8" ) obj = Children() obj.feelT() # 73512648 |
mro 列表 : super用途的一个体现.解决复杂的多继承调用顺序关系
"""
类.mro() 返回的是方法调用顺序列表,针对于多继承下的同名方法,按照顺序依次的进行调用
"""
1 2 3 4 5 6 7 8 9 10 11 12 | lst = Children.mro() print (lst) """ [ <class '__main__.Children'>, <class '__main__.Man'>, <class '__main__.Woman'>, <class '__main__.Human'>, <class 'object'> ] """ |
issubclass 判断子父关系 (应用在类当中,判断子父关系)
"""只要在一条继承链上即可(有血缘关系)"""
1 2 3 4 5 6 7 8 9 10 | res = issubclass (Children,Man) print (res) res = issubclass (Children,Woman) print (res) res = issubclass (Children,Human) print (res) res = issubclass (Children,(Human,Woman,Man,OldWoman)) print (res) res = issubclass (Children,OldWoman) print (res) |
isinstance (应用在对象和类之间,判断类型)
"""只要在一条继承链上即可(有血缘关系)"""
1 2 3 4 5 6 7 8 | res = isinstance (obj,Children) print (res) res = isinstance (obj,Human) print (res) res = isinstance (obj,(Human,Children,Woman)) print (res) res = isinstance (obj,OldWoman) print (res) |
魔术方法 (特定时机,自动触发)
__init__魔术方法(构造方法)
'''
触发时机:实例化对象,初始化的时候触发
功能:为对象添加成员
参数:参数不固定,至少一个self参数
返回值:无
'''
基本语法
1 2 3 4 5 6 7 8 9 | class MyClass(): def __init__( self ): print ( "初始化方法被触发" ) # 为当前对象self 添加成员 name self .name = "花花" # 实例化对象 obj = MyClass() print (obj.name) |
带有多个参数的构造方法
1 2 3 4 5 6 7 | class MyClass(): def __init__( self ,name): # self.成员名 = 参数 self .name = name # 实例化对象 obj = MyClass( "绿绿" ) # 在实例化对象时候,给构造方法传递参数 print (obj.name) |
类可以是一个,对象可以是多个
"""一个类可以实例化多个不同的对象,而对象和对象之间彼此独立,但都可以使用类中的公有的成员"""
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | class Children(): def __init__( self ,name,skin): self .name = name self .skin = skin def cry( self ): print ( "小孩一出生就哇哇哇的哭" ) def drink( self ): print ( "小孩一下生就要喝母乳" ) def __la( self ): print ( "小孩拉粑粑是私有的" ) def pub_info( self ): print ( "该对象的名字是{},该对象的肤色是{}" . format ( self .name, self .skin)) # 创建第一个小孩 afanda = Children( "阿凡达" , "蓝色的" ) afanda.pub_info() afanda.cry() # 创建第二个小孩 afanti = Children( "阿凡提" , "黄色的" ) afanti.pub_info() afanti.drink() # 创建第三个小孩 bao = Children( "我滴宝强" , "绿色的" ) bao.pub_info() bao.__la() # 无法在类外调用私有的成员 |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥