当前位置: 首页 > news >正文

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, '梯阅线条']
'''

相关文章:

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

1 python通过继承、组合、委托组织类 #概念描述1继承属性查找X.name2多态方法调用X.method&#xff0c;取决于X的类型3封装方法和运算符实现行为 通常来说&#xff0c;独特的运算使用独特的方法名称&#xff0c;不要依赖于调用标记。 python组织类结构的方式包括&#xff1a…...

OSG粒子系统与阴影-自定义粒子系统示例<1>(4)

自定义粒子系统示例(一) 自定义粒子系统示例(一)的代码如程序清单11-5所示&#xff1a; /* 自定义粒子系统示例1 */ void particleSystem_11_5(const string &strDataFolder) {osg::ref_ptr<osgViewer::Viewer> viewer new osgViewer::Viewer();osg::ref_ptr<os…...

激活函数与其导数:神经网络中的关键元素

激活函数是神经网络中的重要组成部分&#xff0c;有力地推动了深度学习的发展。然而&#xff0c;仅仅了解和选择激活函数是不够的&#xff0c;我们还需要理解激活函数的导数。本文将详细介绍激活函数的概念、作用及其导数的重要性&#xff0c;并探究导数对神经网络训练的影响。…...

微信公众号对接获取用户openid预约项目心路全历程

公众号对接获取openid全历程 一、背景二、选型三、开始修改若依框架四、自己搭后端框架五、前端框架uni-app修改六、对接获取公众号登录用户openId七、总结 一、背景 老板接了朋友的一个公众号需求&#xff0c;要求做一个简单的疫苗预约系统。功能是获取当前登录用户&#xff0…...

大中小协作 共筑科学梦——华中科技大学附属花城中学举办首届科技节

为普及科学知识&#xff0c;张扬科学精神&#xff0c;创设浓郁的科学氛围&#xff0c;11月24日&#xff0c;华中科技大学附属花城中学举办了以“走近科学&#xff0c;触碰未来”为主题的首届科技节暨科创文化展示周活动。学生们在学习中感受科技的魅力&#xff0c;在“玩”中感…...

ElasticSearch之Health API

查看当前集群全部健康指标的信息&#xff0c;执行如下命令&#xff1a; curl -X GET "https://localhost:9200/_health_report?pretty" --cacert $ES_HOME/config/certs/http_ca.crt -u "elastic:ohCxPHQBEs5*lo7F9"执行结果输出如下&#xff1a; {&quo…...

图的建立基本操作

#include <stdio.h> #include <stdlib.h> #include <stdbool.h> // 添加头文件#define MAX_VERTEX_NUM 100 //图中最大顶点数//struct ArcNode* nextarc; //ArcNode* firstarc; //这两个是很有必要的&#xff0c;如果你没有这两个指针&#xff0c;你就无法判…...

影响语音芯片识别率的因素概述

语音芯片识别率是指芯片对人类语音信号的识别能力。在实际应用中&#xff0c;语音芯片识别率的高低直接影响了用户对芯片的体验和满意度。因此&#xff0c;提高语音芯片识别率是当前语音技术领域的重要任务之一。 1.、语音芯片的硬件设计&#xff1a;设计良好的芯片可以更好地…...

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

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

PDF 批量处理软件BatchOutput PDF mac中文版介绍

BatchOutput PDF mac是一款适用于 Mac 的 PDF 批量处理软件。它可以帮助用户将多个 PDF 文件进行异步处理&#xff0c;提高工作效率。 BatchOutput PDF 可以自动化执行许多任务&#xff0c;包括 PDF 文件的打印、转换、分割、压缩、加密、重命名等&#xff0c;而且它还可以将自…...

oracle安装的肘腋之疾小合集

#临时空间指定 export TMP/tmp export TMPDIR/tmp #图形化显示框不全 java问题&#xff0c;使用系统自带的jre ./runInstaller -jreLoc/usr/local/jdk1.7.0_80/ #ins30131 Failed to access the temporary location 给/tmp/CVU*加x权限 #linux桌面太小 xrandr -s 1440x900_60…...

django(千锋教育)

创建一个django项目 官网下载python最新版本 配置到环境变量中 打开intlij编辑器 创建django项目 安装django&#xff1a;pip install django 创建django项目: django-admin startproject django01 创建djangoAPP&#xff1a;python manage.py startapp user 启动&#xff1…...

Python 前后端分离项目Vue部署应用

一、视图创建 from django.http import JsonResponse from django.shortcuts import render# Create your views here. from django.views import Viewclass IndexView(View):def get(self,request):# 前后端分离 &#xff08;前端JS代码渲染数据&#xff09;return JsonRespo…...

Linux中安装MySQ-合集

Linux中安装MySQL Centos中 1、卸载不必要的软件 先卸载mariadb安装MySQL必要环境 rpm -qa|grep mariadb rpm -e --nodeps mariadb-libs yum install -y gcc-c yum install net-tools yum -y install gcc如果需要Java等程序 yum install -y java* java-1.8.0-openjdk* op…...

elk 简单操作手册

1.1. 基础概念 EFK不是一个软件,而是一套解决方案,开源软件之间的互相配合使用,高效的满足了很多场合的应用,是目前主流的一种日志系统。 EFK是三个开源软件的缩写,分别表示:Elasticsearch , Filebeat, Kibana , 其中Elasticsearch负责日志保存和搜索,Filebeat负责收集日志,Ki…...

CSS画一条线

<p style"border: 1px solid rgba(0, 0, 0, 0.1);"></p> 效果&#xff1a;...

分享常用设计模式之单例模式(懒汉模式和饿汉模式)和几种关于设计模式的面试题

目录 1.单例模式 1.懒汉模式 2.饿汉模式 2.设计一个不能被继承的类 3.设计一个不能被继承但是可以在外部环境创建该类对象的类 4.设计一个可以被继承但不能在外部环境创建该类的对象的类 5.限制派生类对象不能拷贝也不能赋值 1.单例模式 设计一个不能在外部环境创建该类…...

python每日一题——6三数之和

题目 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 …...

黑马点评笔记 分布式锁

文章目录 分布式锁基本原理和实现方式对比Redis分布式锁的实现核心思路实现分布式锁版本一Redis分布式锁误删情况说明解决Redis分布式锁误删问题分布式锁的原子性问题分布式锁-Redission分布式锁-redission可重入锁原理分布式锁-redission锁重试和WatchDog机制分布式锁-redissi…...

java---抽象类 用abstract修饰

抽象类是不能被[ 直接 ] [ 显式 ]实例化的如果抽象类中有一个抽象方法,那么这个类一定要声明为抽象类(反过来说,如果一个类是抽象类,那么它里面可以没有抽象方法)如果父类中有一个抽象方法,那么抽象的子类,要么也得是抽象的,要么就把抽象的方法全部给具体化(实现了) 抽象方法 …...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...

【深度学习新浪潮】什么是credit assignment problem?

Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...