一.继承

定义:一个类除了拥有自身的属性方法之外,还拥有另外一个类的属性和方法
继承: 1.单继承 2.多继承
子类: 一个类继承了另外一个类,那么这个类是子类(衍生类)
父类:一个类继承了另外一个类,被继承的那个类是父类(超类,基类)
object 是所有的类的父类

1.单继承

#例:
class Human():
    def eat(self):
        print("远古人类打猎,吃猎物")

def sleep(self):

print("远古人类吃饱了就睡觉")

def __beat_doudou(self):
        print("远古人类起来先打豆豆,再打猎")
#把要继承的类放到class 定义类的这个括号里面写

(1) 子类可以调用父类的公有成员(方法,属性)

#例:

class Man(Human):
    pass
#实例化对象
obj = Man()
obj.eat()

(2)子类不可以调用父类私有成员(方法,属性)

#例:

class Woman(Human):
    def myskill(self):
        #调用父类公有方法
        self.eat()
        #不能够在子类里面调用父类私有方法
        #self>__beat_doudou()
obj = Woman()
#obj.__beat_doudou() 私有的没法再类外调用
obj.myskill()

(3)子类可以改造父类的公有方法

子父继承之后,如果调用的成员
    子类里面有,优先调用子类的
    子类里面没有,就调用父类

#例:
class Children(Human):
    #对eat方法进行改写
        def eat(self):
            print("小孩生下来只会喝奶")
obj = Children()
obj.eat()

2.多继承

(1)基本语法

#例:
class Father():
    f_property = "风流倜傥,英俊潇洒"
    def f_hobby(self):
        print("喜欢跑步")
class Mother():
    m_property = "沉鱼落雁,闭月羞花"
    def m_hobby(self):
        print("喜欢做菜")
#多继承:在括号里面用逗号,把多个父类隔开
class Daughter(Father,Mother):
    pass
obj = Daughter()
print(obj.f_property)
obj.m_hobby()

(2)调用父类

class Father():
    f_property = "风流倜傥,英俊潇洒"
    def f_hobby():
        print("喜欢跑步")
class Mother():
    m_property = "沉鱼落雁,闭月羞花"

def m_hobby(self):
        print("喜欢做菜")
class Son(Father,Mother):
    #f_property = "子类的属性f_property"
    #(1)通过类的方式调用父类的相关成员
    def skill1(self):
        #调用Father的f_hobby
        Father.f_hobby()
        #调用Mother中的m_property
        print(Mother.m_property)

    #(2)通过对象的方式调用父类的相关成员
    def skill2(self):
        #调用Father中的f_property
        print(self.f_property)
        #调用Mother中的m_hobby
        self.m_hobby()

  #(3)使用super调用父类的相关成员
    def skill3(self):
        # 调用Father中的f_property
        #super() 一定调用的是父类的,区别于self
        #print(super().f_property)
        #super().f_hobby() error super() 调用的是绑定方法,默认传递self参数
        super().m_hobby()
print("============")
obj = Son()
obj.skill1()
#obj.skill2()
obj.skill3()

#关于super的概念

(1)super 本身是一个类,super()是一个对象,用于调用父类的绑定方法
(2)super() 只应用在绑定方法中,默认自动传递self对象(前提:super所在作用域存在self)
(3)super用途:解决复杂的多继承调用顺序

3.菱形继承

#菱形继承就是广度优先算法的方式继承父类函数
#例:下面是关于例1中的继承关系

Human

Man       Woman

Children
#例:
class Human():
    pty = 111
    def feelT(self):
        print("远古人类天热了1")
        print(self.pty)
        print("远古人天冷了2")
class Man(Human):
    pty = 222
    def feelT(self):
        print("现代男性天气热了3")
        super().feelT()
        print("现代男性天冷了4")

class Woman(Human):
    pty = 333
    def feelT(self):
        print("现代女性天热了5")
        super().feelT()
        print("现代女性天冷了6")

class Children(Man,Woman):
    pty = 444
    def feelT(self):
        print("小孩天热了7")
        super().feelT()
        print("小孩天冷了8")

obj = Children()
obj.feelT()
#c.f => 7
#M.f =>3
"""
#mro 列表:通过c3算法,把所有的继承关系按照列表的顺序呈现
#语法:
#类.mro() => 继承顺序列表
[<class '__main__.Children'>,
<class '__main__.Man'>,
 <class '__main__.Woman'>,
 <class '__main__.Human'>,
 <class 'object'>]
super 就是默认按照mro列表的顺序,依次调用
用于解决多继承调用顺序混乱的问题
"""

lst = Children.mro()
print(lst)

#判断是否是子父关系 [有血缘关系即可] issubclass
res = issubclass(Children,Man)
res = issubclass(Children,Human)
#满足一个条件,即返回真
res = issubclass(Children,(Man,Woman))
print(res)
#判断对象的类型, [有血缘关系即可] isinstance
res = isinstance(obj,Children)
res = isinstance(obj,Man)
res = isinstance(obj,(Human,Woman))
print(res)

二.多态(不同的对象)

不同的子类对象,调用相同的父类方法,产生不同的执行结果
特征:继承  重写
好处:在不改变代码的前提下,实现代码的复用,和不同的效果
#例:
class Soldier():
    #攻击
    def attack(self):
        pass
    #撤退
    def back(self):
        pass
#陆军
class Army(Soldier):
    def attack(self):
        print("[陆军]使用坦克进攻轰炸")

def back(self):
        print("[陆军]使用军车进行撤退")
#海军
class Navy(Soldier):
    def attack(self):
        print("[海军]使用鱼雷攻击")

def back(self):
        print("[陆军]开启防御鱼雷模式")
#空军
class Airforce(Soldier):
    def attack(self):
        print("[空军]炮弹袭击")

def back(self):
        print("[空军]降落防空基地")
#实例化各个兵种,各就位准备
obj_army = Army()
obj_navy = Navy()
obj_airforce = Airforce()
lst = [obj_army,obj_navy,obj_airforce]

#等待将军下发命令
strvar = """
您好将军,下面是您的操作按钮:
    1.全体出击
    2.全体撤退
    3.陆军出击,其他人撤退
    4.退出程序
"""
sign = True
while sign:
    print(strvar)
    num = input("将军请下令:")

for i in lst:
        if num == "1":
            i.attack()
        elif num == "2":
            i.back()
        elif num == "3":
            if isinstance(i,Army):
                i.attack()
            else:
                i.back()
        elif num == "4" or num.upper() == "Q":
            sign = False
            break
        else:
            print("风太大,我听不到")
            break

Python 基础之面向对象类的继承与多态的更多相关文章

  1. python基础之面向对象的多继承以及MRO算法

    内容梗概: 1. python多继承 2. python经典类的MRO 3. python新式类的MRO C3算法 1.python多继承 class Shen: def fly(self): pri ...

  2. python 基础 5.2 类的继承

    一. 类的继承 继承,顾名思议就知道是它的意思,举个例子说明,你现在有一个现有的A类,现在需要写一个B类,但是B类是A类的特殊版,我们就可以使用继承,B类继承A类时,B类会自动获得A类的所有属性和方法 ...

  3. Python基础之面向对象3(继承)

    一.继承相关概念 1.语法: 2.定义: 3.优缺点: 4.相关概念: 5.相关内置函数: 6.继承内存图: 7.多继承: 二.多态相关概念 1.定义及作用: 2.重写概念: 3.运算符重载: 定义: ...

  4. Python基础之面向对象:3、继承与派生

    面向对象 一.三大特征之继承 python三大特征: 封装.继承.多态 三者中继承最为核心,实际应用对,感受较为直观 封装和多态略微抽象 1.继承的概念 继承的含义: ​ 在现实生活中,继承表示人与人 ...

  5. python基础——使用元类

    python基础——使用元类 type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Hello的class,就写一个hello. ...

  6. Python 基础 四 面向对象杂谈

    Python 基础  四  面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...

  7. Python3 与 C# 面向对象之~继承与多态 Python3 与 C# 面向对象之~封装 Python3 与 NetCore 基础语法对比(Function专栏) [C#]C#时间日期操作 [C#]C#中字符串的操作 [ASP.NET]NTKO插件使用常见问题 我对C#的认知。

    Python3 与 C# 面向对象之-继承与多态   文章汇总:https://www.cnblogs.com/dotnetcrazy/p/9160514.html 目录: 2.继承 ¶ 2.1.单继 ...

  8. python基础,函数,面向对象,模块练习

    ---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? #  [] {} () None 0 2,位和字节的关系? # ...

  9. (转)Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...

随机推荐

  1. OGG在windows环境下字符集的配置

    windows环境下不配置字符集(默认使用windows自己的字符集),从linux等系统同步过来的表中如果含有中文字符列将显示为乱码,被ogg误认为虚拟列,从而导致进程abend. 设置ogg进程在 ...

  2. 【前端开发API】豆瓣开放API

    转载:https://www.cnblogs.com/HuangJie-sol/articles/10884622.html#_label6 阅读目录 前言 具体api 1.正在热映 2.即将上映 3 ...

  3. layui 延时加载

    //延时关闭当前页面,并刷新父页面layer.msg('提交成功',{time: 1800},function () { parent.layer.close(index); window.paren ...

  4. python3实现在二叉树中找出和为某一值的所有路径

    在二叉树中找出和为某一值的所有路径请写一个程序创建一棵二叉树,并按照一定规则,输出二叉树根节点到叶子节点的路径.规则如下:1.从最顶端的根结点,到最下面的叶子节点,计算路径通过的所有节点的和,如果与设 ...

  5. Fluent_Python_Part3函数即对象,06-dp-1class-func,一等函数与设计模式

    使用一等函数实现设计模式 中文电子书P278 合理利用作为一等对象的函数,把模式中涉及的某些类的实例替换成简单的函数,从而简化代码. 1. 重构"策略"模式 中文电子书P282 P ...

  6. Spring Boot 定时任务 Quartz 使用教程

    Quartz是一个完全由java编写的开源作业调度框架,他使用非常简单.本章主要讲解 Quartz在Spring Boot 中的使用. 快速集成 Quartz 介绍 Quartz 几个主要技术点 Qu ...

  7. 解决游览器安装Vue.js devtools插件无效的问题

    一: 打开自己写的一个vue.js网页,发现这个图标并没有亮起来,还是灰色 解决方案:  1.我们先看看Vue.js devtools是否生效,打开Bilibili(https://www.bilib ...

  8. jQuery学习(三)

    jQuery文档操作方法 1.内部追加内容 选择器追加到内容 append(content)在当前jQuery对象内部所包含的DOM对象的内部的最后追加content对应的内容,其中content可以 ...

  9. WLAN配置SKC

    1.关于SKC WLC支持粘滞密钥缓存(Sticky Key Caching,SKC). 通过SKC,客户端为其关联的每个AP接收并存储不同的PMKID. AP还维护发布给客户端的PMKID数据库. ...

  10. 比较好的IT教程网

    MDN最完整的Web标准,Webapi                https://developer.mozilla.org/zh-CN/docs/Web 主要几个比较常用教程网都可以 gitbo ...