python通过继承、组合、委托组织类

1 python通过继承、组合、委托组织类

#概念描述
1继承属性查找X.name
2多态方法调用X.method,取决于X的类型
3封装方法和运算符实现行为

通常来说,独特的运算使用独特的方法名称,不要依赖于调用标记。

python组织类结构的方式包括:继承、组合、委托。

1.1 继承:是一个关系

python的继承通过点号运算触发,比如X.name,在实例、类、超类中搜索属性。

#概念描述
1超类、基类、父类被继承的类
2派生类、子类继承的类
3派生父类向子类看
4继承子类项父类看

子类继承父类,子类和父类为“是一个(is-a)”关系,子类是父类的一种,子类是一个更具体,更全面的父类。

比如:员工是父类,清洁和扫地机器人工是子类,扫地机器人是清洁工,清洁工是一个员工。

示例

class Staff:#员工def __init__(self,name,salary=0):self.name=nameself.salary=salarydef payRaise(self,percent):self.salary=self.salary*(1+percent)def work(self):#干一些事情print(self.name,'does stuff')def __repr__(self):return '<Staff:name={},salary={}>'.format(self.name,self.salary)class Cleaner(Staff):#保洁员def __init__(self,name):Staff.__init__(self,name,3000)def work(self):#打扫客房print(self.name,'cleaning guest rooms')class Waiter(Staff):#前台服务员def __init__(self,name):Staff.__init__(self,name,5000)def work(self):#接待顾客print(self.name,'Receiving customers')class SweepRobot(Cleaner):#扫地机器人def __init__(self,name):Staff.__init__(self,name,2000)def work(self):#打扫大堂print(self.name,'cleaning the lobby')if __name__=='__main__':srb1=SweepRobot('robot1')print(srb1)srb1.work()srb1.payRaise(0.1)print(srb1);print()for klass in Staff,Cleaner,Waiter,SweepRobot:obj = klass(klass.__name__)obj.work()'''E:\documents\F盘>python staffs.py
<Staff:name=robot1,salary=2000>
robot1 cleaning the lobby
<Staff:name=robot1,salary=2200.0>Staff does stuff
Cleaner cleaning the office
Waiter Receiving customers
SweepRobot cleaning the lobby
'''

1.2 组合:有一个关系

python的组合类通过内嵌其他类的对象来实现自己的接口。

组合类有一个或多个内嵌类(组件类)的对象作为自己的属性。

组合类和内嵌类为“有一个(has a)”关系。

比如,酒店类(Hotel)有前台服务员(Waiter)和保洁员(Cleaner)两个类对象作为属性,实现酒店的退房操作。

from staffs import Waiter,Cleanerclass Customer:def __init__(self,name,roomNo):self.name=nameself.roomNo=roomNodef checkOut(self,waiter):#退房print(self.name,'退房,房号为',self.roomNo)def backCard(self,waiter):#归还房卡print(self.name,'归还房卡给',waiter.name)class Hotel:def __init__(self):#Hotel有 Waiter 和 Cleaner 类的对象self.waiter1 = Waiter('前台1号')self.cleaner1=Cleaner('保洁员1号')def checkOut(self,name,roomNo):#退房流程cust1=Customer(name,roomNo)cust1.checkOut(self.waiter1)cust1.backCard(self.waiter1)self.cleaner1.work()if __name__ == '__main__':hot1=Hotel()hot1.checkOut('顾客1号','168')
'''E:\documents\F盘>python hotel.py
顾客1号 退房,房号为 168
顾客1号 归还房卡给 前台1号
保洁员1号 cleaning guest rooms
'''

1.3 继承组合例子

Processor内嵌reader和writer实例对象,为组合类,并且定义子类继承必须实现的方法converter,为转换器。

streams.py

from abc import ABCMeta,abstractmethod
class Processor:def __init__(self,reader,writer):#组合类self.reader=reader#读取器实例self.writer=writer#写入器实例def process(self):while 1:data=self.reader.readline()if not data:breakdata=self.converter(data)self.writer.write(data)@abstractmethoddef converter(self,data):#继承,子类实现转换器pass

converters.py

from streams import Processorclass Uppercase(Processor):def converter(self,data):#实现抽象超类的方法return data.upper()
class HTMLize:def write(self,line):print('<UP>{}</UP>'.format(line.rstrip()))
if __name__ == '__main__':sep='---------------'import sysprint('查看 tyxt.txt内容:\n{}'.format(open('tyxt.txt').read()))print(sep)Uppercase(open('tyxt.txt'),sys.stdout).process()print()print(sep)Uppercase(open('tyxt.txt'),open('tyxtup.txt','w')).process()print('查看 tyxtup.txt内容:\n{}'.format(open('tyxtup.txt').read()))print(sep)Uppercase(open('tyxt.txt'),HTMLize()).process()'''
E:\documents\F盘>python converters.py
查看 tyxt.txt内容:
tyxt.work
bbs.tyxt.work
---------------
TYXT.WORK
BBS.TYXT.WORK
---------------
查看 tyxtup.txt内容:
TYXT.WORK
BBS.TYXT.WORK
---------------
<UP>TYXT.WORK</UP>
<UP>BBS.TYXT.WORK</UP>
'''

1.4 委托:包装对象

用法

在__init__(self,obj)方法中传入被委托对象(obj),并且赋值给包装类的属性。

在__getattr__(self,attrname)方法,拦截被委托对象的点号运算,返回属性。

示例

class MyWrapper:def __init__(self,obj):#传入被委托对象,赋值给包装类的属性self.wrapped=objdef __getattr__(self,attrname):#拦截点号运算print('trace:',attrname)#返回被委托对象属性return getattr(self.wrapped,attrname)
if __name__ == '__main__':mwL=MyWrapper([1,2,3])mwL.append('梯阅线条')print(mwL.wrapped)
'''E:\documents\F盘>python trace.py
trace: append
[1, 2, 3, '梯阅线条']
'''

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/169683.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统的主要功能--处理机、存储器、设备、文件

一、处理机管理功能 对处理机的管理可以归结为对进程的管理。处理机管理的主要功能包括&#xff1a;创建和撤销进程&#xff0c;对进程的运行进行协调&#xff0c;实现进程之间的信息交换&#xff0c;并且按照异地你给的算法将处理机分配给进程 进程控制&#xff1a;为一个作…

可验证随机函数(VRF)

文章目录 一、背景以及场景共识发展第一代 POW “以力取胜”第二代 POS/DPOS “民主投票”第三代 VRF “运气抽签” 二、可验证随机函数&#xff08;VRF&#xff09;快速开始1. VRF是什么?2. MD5 hash函数和VRF&#xff08;Verifiable Random Function&#xff09;区别3. VRF-…

数据结构之数组:简介、特性与应用

文章目录 &#x1f33e;引言&#x1f33e;数组的定义与特性&#x1f33f;数组的定义&#x1f33f;数组的特性&#x1f33f;数组的优缺点 &#x1f33e;数组的应用场景&#x1f341;数组的基本应用&#x1f341;动态数组&#xff08;Dynamic Array&#xff09;&#x1f341;多维…

SQL 注入漏洞的理解

SQL 注入漏洞的理解 1. 漏洞描述 SQL注入漏洞是一种存在于Web 应用程序中的安全漏洞&#xff0c;它允许攻击者通过在用户中注入恶意的SQL 到吗&#xff0c;来操纵应用程序和数据库之间的交互&#xff0c;来执行未经授权的SQL命令。 2. 漏洞原理 SQL注入漏洞产生的原因主要是因为…

项目里边更换了同名的图片地址 / 图片没有及时更新 / 什么原因

一、问题分析 1.1、分析一 浏览器缓存 项目里边更换了同名的图片地址&#xff0c;图片没有及时更新 可能是浏览器缓存的原因&#xff0c;浏览器会将之前访问过的文件缓存下来&#xff0c;下次访问同名的文件时会先从缓存中读取。 如果相同的图片地址没有发生变化&#xff0c…

【刷题宝典NO.4】

目录 公交站间的距离 生命游戏 公交站间的距离 https://leetcode.cn/problems/distance-between-bus-stops/ 环形公交路线上有 n 个站&#xff0c;按次序从 0 到 n - 1 进行编号。我们已知每一对相邻公交站之间的距离&#xff0c;distance[i] 表示编号为 i 的车站和编号为 …

Axios笔记

目录 一、安装Axios 二、发送请求 &#xff08;一&#xff09;Get请求 &#xff08;二&#xff09;Post请求 1. 第一种方式 2. 第二种方式 三、拦截器 &#xff08;一&#xff09;请求前拦截器 &#xff08;二&#xff09;应答拦截器 四、封装 一、安装Axios -g 全局…

程序员职场可能遇到的问题总结!

在职场中&#xff0c;你是否遇到过这样的领导或同事&#xff0c;他可能是自恋狂&#xff0c;自吹自擂自我标榜&#xff1b;可能是团队合作的绊脚石&#xff0c;对团队合作态度消极并频繁拖后腿&#xff1b;可能是抱怨专家&#xff0c;满满负能量&#xff1b;可能是完美主义者&a…

二十一、数组(6)

本章概要 数组排序Arrays.sort的使用并行排序binarySearch二分查找parallelPrefix并行前缀 数组排序 根据对象的实际类型执行比较排序。一种方法是为不同的类型编写对应的排序方法&#xff0c;但是这样的代码不能复用。 编程设计的一个主要目标是“将易变的元素与稳定的元素…

win11渗透武器库,囊括所有渗透工具

开箱即用&#xff0c;最全的武器库&#xff0c;且都是2023年11月最新版&#xff0c;后续自己还可以再添加&#xff0c;下载地址&#xff1a;https://download.csdn.net/download/weixin_59679023/88565739 服务连接 信息收集工具 端口扫描 代理抓包 漏洞扫描 指纹识别 webshel…

【C语法学习】28 - 字符测试函数

文章目录 1 isalnum()函数2 isalpha()函数3 islower()函数4 isupper()函数5 isdigit()函数6 isxdigit()函数7 iscntrl()函数8 isgraph()函数9 isspace()函数10 isblank()函数11 isprint()函数12 ispunct()函数13 tolower()函数14 toupper()函数 1 isalnum()函数 isalnum()函数…

SpringBoot——》关联映射

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

移动机器人路径规划(七)--- 基于MDP的路径规划MDP-Based Planning

目录 1 什么是MDP-Based Planning 2 worst-case analysis for nondeterministic model 3 Expected Cost Planning 4 Real Time Dynamic Programming&#xff08;RTDP&#xff09; 1 什么是MDP-Based Planning 之前我们从起点到终点存在很多可执行路径&#xff0c;我们可以…

Can‘t find libdevice directory ${CUDA_DIR}/nvvm/libdevice

win10 Running deepxde 的时候出现问题&#xff1a; cuda-nvcc 安装后解决了。 # Install NVCC conda install -c nvidia cuda-nvcc11.3.58 -y # Configure the XLA cuda directory mkdir -p $CONDA_PREFIX/etc/conda/activate.d printf export LD_LIBRARY_PATH$LD_LIBRARY_P…

Python实现一箭穿心

文章目录 &#x1f384;效果&#x1f3f3;️‍&#x1f308;Turtle模块&#x1f339;代码&#x1f33a;代码讲解 &#x1f384;效果 &#x1f3f3;️‍&#x1f308;Turtle模块 Turtle是一个绘图工具&#xff0c;是Python标准库中的一个模块。它提供了一种简单而直观的方式来创…

【C++】内存管理(new与delete)

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 前言 本篇文章我们一起来学习C的内存管理方式&…

最新yolov8环境搭建、推理训练一站式超详细教学

1、获取yolov8源码 访问yolov8_github官网&#xff0c;网络不稳定时可能需要加速器。yolov8源码地址 获取方式&#xff1a;直接下载或者git工具克隆 我使用git操作进行演示&#xff0c;复制github上的地址(需提前关闭加速器)。 git clone https://github.com/ultralytics/ul…

【QML】Qt设置USB免驱相机曝光时间(Linux系统)UVC

1. 问题 使用QML的Camera组件创建相机。需要配置曝光时间&#xff0c;使用CameraExposure中的exposureCompensation&#xff0c;exposureMode配置无效果&#xff0c;原因可能是不支持USB相机。 有两种方法经测试有效果&#xff1a; 命令行调用v4l2-ctl命令的方法&#xff0c…

【XSLVGL2.0】如何做全局键功能和键值映射

XSLVGL2.0 开发手册 【XSLVGL2.0】如何做全局键功能和键值映射 1、概述1、概述 项目常见需要配置一个按键,并要求短按此按键回到首页, 长按此按键进行关机。 XSLVGL2.0在输入设备对接接口中,有一个回调,在此回调中可以直接收到输入设备上报的所有按键事件。 一般这个功能…

UI自动化(selenium+python)之元素定位的三种等待方式!

前言 在UI自动化过程中&#xff0c;常遇到元素未找到&#xff0c;代码报错的情况。这种情况下&#xff0c;需要用等待wait。 在selenium中可以用到三种等待方式即sleep,implicitly_wait,WebDriverWait 一、固定等待(sleep) 导入time模块&#xff0c;设定固定的等待时间 缺…