广告
返回顶部
首页 > 资讯 > 后端开发 > Python >多继承 , 组合 , 菱形继承 , 接口
  • 943
分享到

多继承 , 组合 , 菱形继承 , 接口

组合菱形接口 2023-01-31 00:01:55 943人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

一, 复习 属性的的正确存放位置: 类中应该存储所有对象公共的内容 对象中存储都是每个对象独有的(都不同) 初始化函数: 给对象的属性赋初值 , 可以保证只要对象被创建就一定有相应的属性 节省了重复代码

一, 复习

属性的的正确存放位置:
    类中应该存储所有对象公共的内容
    对象中存储都是每个对象独有的(都不同)
初始化函数:
    给对象的属性赋初值 , 可以保证只要对象被创建就一定有相应的属性
    节省了重复代码

绑定方法:
    指的是 将类或对象与函数进行了绑定
    之所以绑定是为了提高整合度,后续在拿到对象就可以直接调用而无需关心 数据是什么 如何处理
    对象也可以看做是一个存储数据的容器

    对象绑定方法:
        默认情况下就是绑定给对象的
        当执行该方法时,需要访问对象中的内容
        当使用对象调用时 会自动传入对象本身作为第一个参数
        用类来调用时就是一个普通函数  该怎么传就这么传
    类绑定方法:
        当执行该方法时,需要访问类中的内容而不需要对象中的内容
        @claSSMethod
        无论使用类还是对象来调用都会自动传入类本身作为第一个参数
    非绑定方法
        既不需要访问类中的内容 也不需要访问对象中的内容  那就作为非绑定方法  就是一个普通函数  没有自动传值的效果
        @staticmethod

继承
    说的是类与类之间的关系
    存在基础关系后 子类可以直接使用父类已经存在的内容   总的来说是为了提高代码的复用性
    例如猫 和狗 都属于动物类
    描述的时 什么是什么的关系  如:猫是动物

    要开始累积自己的类库 把经常使用的小功能写到一个模块中  以后可以直接调用

    class 子类(父类):
        pass

属性查找顺序
    对象本身 -> 所在的类 -> 类的父类 -> .... object

抽象
    使用基础时 应该先抽象 在继承
    抽象指的是 把一系列类中的相同的特征和行为抽取 形成一个新的类 (公共父类)

派生
    子类拥有与父类不同的内容
覆盖
    子类出现了与父类完全相同的名字

一切皆对象
    在py3里面所有东西全是对象  包括 int list 模块 函数 .....包等等....
    list.append(li,1)


子类访问父类的内容
    1.指名道姓 直接写死了类名   即时不存在继承关系也能调用
    2.super().要访问的属性 (py3出现的)
    3.super(这个子类的名字,self).属性

 

二 , 继承已有的类来扩展新功能


#实现一个存储类,在提供基本的存取功能之外,还要可以限制存储元素的类型 class MyList(list): def __init__(self,element_cls): #当你覆盖了init时,不要忘记调用super().init函数让父类完成原有的初始化操作 super().__init__() self.element_cls = element_cls def append(self,object): if object.__class__ == self.element_cls: #如果传进来的数据与我限制的的类型匹配上,则添加到列表 super().append(object) else: print('只能存储%s类型!'%self.element_cls.__name__) li = MyList(str) li.append(10) #只能存储str类型! li.append('123') print(li) #['123']

 

三 , 多继承问题

class A:
    def test(self):
        print('from A')
        super().test()      #应该报错,但是执行成功了

class B:
    def test(self):
        print('from B')


class C(A,B):
    pass

c = C()
c.test()
# from A
# from B

print(C.mro())  #[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]

#问题:多继承时如果多个父类中出现了同名的属性/函数
#你不能用眼睛去判断查找顺序,需要使用mro列表去查看真正的继承顺序
#总结:super在访问父类属性时,是按照mro列表一层层往上找的

class A:
    a = 1
    pass

class B(A):
    a = 2
    pass

class C(A):
    a = 3
    pass

class D(A):
    a = 4
    pass

class E(B,C,D):
    a = 5
    pass

aa = E()
print(aa.a)
print(E.mro())  #[<class '__main__.E'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.A'>, <class 'object'>]

 

四  , 组合

'''
组合:
    指的是一个类把另一个类作为自己的属性来使用,就称之为组合
    当你定义一个类,并且这个类拥有某种类型的属性时,就称之为组合
    
组合描述的是:什么拥有什么的关系,  学生有书  学生有手机
继承描述的是:什么是什么的关系   麦兜是猪  猪猪侠也是猪
'''''

class PC:
    def open_app(self,app_name):
        print('open %s'% app_name)

class Student:
    def __init__(self,PC,notbook):
        self.PC = PC
        self.notbook = notbook


pc = PC()
notbook = PC()

s = Student(pc,notbook)
s.PC.open_app('qq')
s.notbook.open_app('what')
# s.PC.open_app('ch')

 

五 , 菱形继承

# 在py2中 A就是一个经典类
# class A:
#     pass

# 如果你的代码需要兼容py2 那应该显式的继承object  无论是直接还是间接继承
class B(object):
    pass

class A(B):
    pass

 

六 , 接口

'''
接口:就是一套协议规范
具体表现形式:有一堆函数,但是只明确了函数的名称,没有明确函数的具体表现
'''''

import  abc

class USB(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def open(self):
        pass
    @abc.abstractmethod
    def work(self):
        pass
    @abc.abstractmethod
    def close(self):
        pass


class Mouse(USB):
    #实现接口规定的所有功能
    def open(self):
        print('mouse open')

    def work(self):
        print('mouse Word')

    def close(self):
        print('mouse close')

class KeyBord:
    def open(self):
        print('KeyBoard open')

    def work(self):
        print("KeyBoard working...")

    def close(self):
        print("KeyBoard closed")
#问题是无法限制子类,必须真正的实现接口中的功能 class Camera(USB): def open(self): pass def work(self): pass def close(self): pass class PC: def device(self,usb_device): usb_device.open() usb_device.work() usb_device.close() #在实例化Camera abc模块就会检查Camera是否实现了所有的抽象方法,如果没有则无法实例化 c = Camera() p = PC() #创建一个鼠标设备 m = Mouse() #创建一个键盘设备 key1 = KeyBord() #链接到电脑上 p.device(m) p.device(key1) p.device(c)

 

七 , 抽象

'''
抽象类:具备抽象方法的类
抽象方法是,没有函数体的方法
抽象类的特点:不能直接实例化
'''''

import abc
class Test(metaclass=abc.ABCMeta):

    @abc.abstractmethod
    def say_hi(self):
        pass

    #可以有普通函数
    def info(self):
        print('my class is Test')

class TT(Test):
    def say_hi(self):
        print('i an TT obj')
    # pass


t = TT()
t.info()
t.say_hi()

 

八 , 鸭子类型

class PC():

    def conntent_device(self, usb_device):
        usb_device.open()
        usb_device.work()
        usb_device.close()


class Mouse:
    # 实现接口规定的所有功能
    def open(self):
        print("mouse opened")

    def work(self):
        print("mouse working...")

    def close(self):
        print("mouse closed")

mouse = Mouse()
pc = PC()

pc.conntent_device(mouse)



class KeyBoard:
    def open(self):
        print("KeyBoard opened")

    def work(self):
        print("KeyBoard working...")

    def close(self):
        print("KeyBoard closed")

key1 = KeyBoard()

# 如果key1的特征和行为都像USB设备 那就把它当做USB设备来使用
# 对于使用者而言可以不用关心这个对象是什么类,是如如何是实现,
pc.conntent_device(key1)

 

class linux:
    def read_data(self,device):
        data = device.read()
        return data

    def write_data(self,device,data):
        device.write(data)

class Disk:
    def read(self):
        print("disk reading....")
        return "这是一个磁盘上的数据"

    def write(self,data):
        print("disk writing %s..." % data)

class UP:
    def read(self):
        print("disk reading....")
        return "这是一个U盘上的数据"

    def write(self,data):
        print("disk writing %s..." % data)


l = Linux()


d = Disk()
data = l.read_data(d)
l.write_data(d,"这是一个数据....")


up1 = UP()
l.read_data(up1)
l.write_data(up1,"一个数据...")

 

--结束END--

本文标题: 多继承 , 组合 , 菱形继承 , 接口

本文链接: https://www.lsjlt.com/news/182338.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 多继承 , 组合 , 菱形继承 , 接口
    一, 复习 属性的的正确存放位置: 类中应该存储所有对象公共的内容 对象中存储都是每个对象独有的(都不同) 初始化函数: 给对象的属性赋初值 , 可以保证只要对象被创建就一定有相应的属性 节省了重复代码 ...
    99+
    2023-01-31
    组合 菱形 接口
  • C++数据结构继承的概念与菱形继承及虚拟继承和组合
    目录继承的概念继承的定义基类和派生类对象之间的赋值转换继承中的作用域派生类的默认成员函数继承中的两个小细节继承和友元继承和静态成员单继承和多继承(菱形继承)虚拟继承概念虚拟继承的原理...
    99+
    2022-11-13
  • 菱形继承问题
    目录 类的分类 新式类 经典类 菱形继承问题 C3算法与mro()方法介绍 ...
    99+
    2023-01-31
    菱形
  • C++继承与菱形继承详细介绍
    目录继承的概念和定义基类和派生类之间的赋值继承中的作用域派生类的默认成员函数菱形继承继承和组合的区分与联系其余注意事项继承的概念和定义 继承机制是面向对象程序设计的一种实现代码复用的...
    99+
    2022-11-13
  • C++数据结构继承的概念与菱形继承及虚拟继承和组合分析
    这篇“C++数据结构继承的概念与菱形继承及虚拟继承和组合分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++数据结构继承...
    99+
    2023-06-29
  • 【C++历险记】面向对象|菱形继承及菱形虚拟继承
    个人主页:兜里有颗棉花糖💪 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【C++之路】💌 本专栏旨...
    99+
    2023-09-08
    c++ 面向对象
  • C++中的继承问题(继承基本概念、菱形虚拟继承的对象模型)
    目录一、继承的概念与定义格式概念及定义格式二、赋值兼容规则三、继承中的作用域四、子类的默认成员函数构造函数拷贝构造函数赋值运算符重载析构函数构造和析构函数调用顺序五、继承与友元、静态...
    99+
    2023-02-05
    C++的继承 继承基本概念 菱形虚拟继承
  • C++中菱形继承怎么处理
    本篇内容介绍了“C++中菱形继承怎么处理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!封装,继承,多态。这是C++语言的三大特性,而每次在谈...
    99+
    2023-06-29
  • 一文读懂C++中的继承之菱形继承(案例分析)
    目录前言一、什么是多继承?1.单继承2.多继承二、菱形继承1.虚基类的引入2.虚基表的引入总结前言 我们上一篇说了世间万物都有一个继承体制,或多或少子类继承了父类的某些特征,但大多都...
    99+
    2022-11-12
  • C++继承的赋值转换与菱形虚拟继承深入详解
    目录一、继承的概念及定义1.1、继承的概念1.2、继承的定义二、基类和派生类对象赋值转换三、继承中的作用域3.1、继承同名成员处理方式3.2、继承同名静态成员处理方式3.3、继承与友...
    99+
    2022-11-13
    C++继承的赋值转换 C++菱形虚拟继承
  • Java继承与组合
    系列文章目录 你真的知道怎样用java敲出Hello World吗?—初识JAVA 你知道为什么会划分数据类型吗—JAVA数据类型与变量 10 > 20 && 10 / 0 == 0等于串联小灯泡—J...
    99+
    2023-09-06
    java
  • php中怎么实现类继承和接口继承
    这篇文章将为大家详细讲解有关php中怎么实现类继承和接口继承,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、PHP类不支持多继承,也就是子类只能继承一个父...
    99+
    2022-10-18
  • Java中的接口多继承机制
    目录问题原因一个接口可以同时继承多个接口接口不能实现任何接口一个类可以实现多个接口一个类只能继承一个父类总结:问题原因 今天在看集合源码的时候,突然看到接口继承接口,觉得有点差异,以...
    99+
    2022-11-13
  • JavaScript组合继承详解
    目录1、前言2、原型链继承3、构造函数继承4、组合继承1、前言 首先学习继承之前,要对原型链有一定程度的了解。 不了解可以去先阅读我另一篇文章,里面对原型链有一个较为详细的说明:Ja...
    99+
    2022-11-12
  • day25-python之继承组合
    1.上节回顾 1 class School: 2 x=1 3 def __init__(self,name,addr,type): 4 self.Name=name 5 self...
    99+
    2023-01-31
    组合 python
  • php中类继承与接口继承的区别是什么
    本文操作环境:Windows10系统、PHP7.1版、Dell G3电脑。php中类继承与接口继承的区别是什么PHP类继承:PHP类不支持多继承,也就是子类只能继承一个父类,但是支持多层次继承比如:class frist{ public...
    99+
    2015-02-22
    PHP
  • php中类继承与接口继承的区别有哪些
    今天小编给大家分享一下php中类继承与接口继承的区别有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在PHP中,类继承与...
    99+
    2023-06-29
  • C++中菱形继承的解释与处理详解
    封装,继承,多态。这是C++语言的三大特性,而每次在谈到继承时我们不可避免的要谈到一个很重要的问题——菱形继承。 派生类继承父类,同时也会继承父类中的所有成员...
    99+
    2022-11-13
  • java接口可以继承吗?
    java接口可以继承吗?java接口可以继承,而且是多继承,但是只能是接口继承接口,类只能实现接口。一个接口可以继承另一个或多个接口,一个普通类可以实现多个接口。接口是常量值和方法定义的集合。接口是一种特殊的抽象类。java类是单继承的。c...
    99+
    2016-12-01
    java教程 java 接口 继承
  • C#怎么继承InterfaceInheritance.cs接口
    本文小编为大家详细介绍“C#怎么继承InterfaceInheritance.cs接口”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#怎么继承InterfaceInheritance.cs接口”文章能帮助大家解决疑惑,下面跟着小编的思路...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作