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() # 无法在类外调用私有的成员

  

 
 
 
posted @   liyaaa  阅读(131)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥
点击右上角即可分享
微信分享提示