一.继承

定义:一个类除了拥有自身的属性方法之外,还拥有另外一个类的属性和方法
继承: 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. 我的18vps~

    自从买了18vps的香港虚拟主机后,就面临一个问题,浏览器无法访问它的apache服务,后来发现,需要同时开启nginx服务: /usr/local/nginx/sbin/nginx -c /usr/ ...

  2. Go语言基础之runtime包

    文章引用自 Golang中runtime的使用 runtime调度器是非常有用的东西,关于runtime包几个方法: Gosched:让当前线程让出cpu以让其他线程运行,它不会挂起当前线程,因此当前 ...

  3. 洛谷 P1076 寻宝(模拟 && 剪枝)

    嗯... 题目链接:https://www.luogu.org/problem/P1076 这道题的题意首先太难理解...并且细节太多... 可以用b[i][j]记录每个指示牌上的数字,a[i][j] ...

  4. 安卓之文本视图TextView及跑马灯效果

    一.基本属性和设置方法 二.跑马灯用到的属性与方法说明 三.省略方式的取值说明 四.跑马灯效果案例代码   (1)布局xml文件 <?xml version="1.0" en ...

  5. 计算机二级-C语言-程序填空题-190110记录-文件写入与文件读出显示

    //给定程序功能是:从键盘输入若干行文本(每行不超过80个字符),写到文件myfile4.txt中,用-1(独立一行)作为字符串输入结束的标志,然后将文件的内容读到显示在屏幕上.文件的读写分别由自定义 ...

  6. Python中注释与声明

    Python中注释的写法 #:使用井号进行单行注释 Python中貌似没有提供多行注释,不过我们可以利用三引号的多行字符串来进行多行注释 """ 多行注释内容 多行注释内 ...

  7. MediaCreationTool制作WIN10安装U盘,安装纯净版win10的通用教程

    注意: 1.准备8G或8G以上U盘. 2.安装系统前备份好个人需要数据(制作U盘会格式化U盘,U盘内有需要的数据也事先备份好) 3.有预装office的务必记住自己激活office账户和密码以免重装后 ...

  8. Golang核心编程

    源码地址: https://github.com/mikeygithub/GoCode 第1章 1Golang 的学习方向 Go 语言,我们可以简单的写成 Golang 1.2Golang 的应用领域 ...

  9. 吴裕雄 python 神经网络——TensorFlow 花瓣分类与迁移学习(2)

    import glob import os.path import numpy as np import tensorflow as tf from tensorflow.python.platfor ...

  10. SSL 证书格式普及,PEM、CER、JKS、PKCS12

    根据不同的服务器以及服务器的版本,我们需要用到不同的证书格式,就市面上主流的服务器来说,大概有以下格式: .DER .CER,文件是二进制格式,只保存证书,不保存私钥. .PEM,一般是文本格式,可保 ...