设计模式(Python语言)—-组合模式

Python64

推荐文章

2023年,摸鱼计划系列活动又跟大家见面了,我们活动规则不变,福利升级! 新的一年,继续把工作学习中的bug处理、碎片知识,统统记录到博客里。留下自己在技术之路的成长足迹。
推荐原创51CTO博客13天前10000+阅读11点赞733评论1收藏

在51CTO博客成功发布第一篇博文,可领取新人福利,奖品三选一。来分享属于自己的技术踩坑经验吧!
推荐原创51CTO博客95天前10000+阅读16点赞11评论5收藏

;
原创Marydon2小时前132阅读点赞评论收藏

出现网关不亮灯的原因就是配置问题,仔细检查网关和微端程序的IP地址有没有填错,如有填错更改过来即可。​微端无连接不更新的问题解决方法​1、端口不对​微端没有更新,玩家进入游戏是地图跟装备都看不见,是漆黑的,微端显示连接失败,好吧,那么从头开始检查,检查什么地方呢,第一检查微端网关程序,看看上面是否全部显示连接成功了,如果是成功的,那么看一下列表里面的端口对不对的上​服务器IP都是连接成功的,没有连
原创会开服的小杰2小时前147阅读1点赞评论收藏

本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注!作者|慕课网精英讲师 然冬基于 IEEE 754 标准的双精度 64 位二进制格式的值(-(253 -1) 到 253 -1)。——MDN在 JavaScript 只有浮点数(可以理解成带有小数点的数)。数字就是我们日常使用的数字,在 JavaScript 中默认是十进制的。10;-1;1.1;10.0;+0;-0;99999
原创imooc慕课君2小时前154阅读点赞评论收藏

本篇介绍下flea-jersey模块的文件下载功能
原创Huazie2小时前143阅读点赞评论收藏

_app.js只加入一个 ThemeProvide 具体在 ThemeProvide 中import type { AppProps } from "next/app
原创JediHongbin2小时前146阅读点赞评论收藏

概念数据库连接池其实就是一个容器(集合),存放数据库连接的容器。当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。好处1.节约资源2.用户访问高效实现标准接口:DataSource javax.sql包下的方法:获取连接:getConnection()归还连接:Connection.close()。如果连接对
原创共饮一杯无2小时前138阅读1点赞评论1收藏

项目中需要自定义icon,在项目中通用html使用css样式.icon-save { /使用自己的图片来替换/ background: url('图片地址') center no-repeat; background-size: contain;}.icon-save::before { /*before
原创不叫猫先生3小时前138阅读点赞评论收藏

二叉树的锯齿形层序遍历(树、广度优先搜索)给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。例如:给定二叉树3,9,20,null,null,15,7,3/\920/\157返回锯齿形层序遍历如下:3,20,9,15,7解答:javapublicclassTreeNode{intval;TreeNodeleft;TreeNode
原创共饮一杯无3小时前141阅读1点赞评论1收藏

1.情景展示 where限制条件后面如果想要加select语句的话,如何实现? 2.原因分析 通常情况下,where后面跟的是:clo
原创Marydon3小时前150阅读点赞评论收藏

编码进化回忆上次内容上次 研究了 视频终端的 演化 从VT05 到 VT100从 黑底绿字 到 RGB 24位真彩色形成了 VT100选项从而 将颜色 ​​数字化​​ 了生活中我们更常用 10个数字 但是 计算机中 用二进制日常计数的十进制数 是如何存储进计算机的呢??从10进制到2进制日常生活中 为什么用10进制? 是因为 人的生理结构计算机中 使用2进制 是因为 计算机的生理结构 电灯、开关
原创overmind19803小时前134阅读点赞评论收藏

程序员的日历,真的不用上网查,直接一条命令就可以默认显示本月的日历(20230214)bashcal二月2023日一二三四五六12345678910111213141516171819202122232425262728显示指定年份的日历bashcaly20232023一月二月三月日一二三四五六日一二三四五六日一二三四五六12345671234123489101112131456789101156
原创彭世瑜3小时前140阅读点赞评论收藏

效果如下图所示:我们实际上使用了2D来模拟3D效果。!(https://s2.51cto.com/images/blog/202302/14095121_63eae919a42774018.png?xossprocess=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20
原创JerryWang汪子熙3小时前148阅读点赞评论收藏

写在前面+K9s是一个基于终端UI的K8S管理工具+博文内容为k9s在windows、Linux以及docker安装Demo+简单的热键使用。+理解不足小伙伴帮忙指正
原创山河已无恙3小时前136阅读点赞评论收藏

写在前面+kubebox是一个轻量的k8s管理工具,可以基于命令行终端或Web端+博文内容涉及:kubebox不同方式的安装下载,简单使用。+如果希望轻量一点,个人很推荐这个工具,轻量,而且使用简单。+理解不足小伙伴帮忙指正我所渴求的,無非是將心中脫穎語出的本性付諸生活,為何竟如此艱難呢赫尔曼·黑塞《德米安》简单介绍Kubebox是一个类似k9s的基于命令行终端的k8s管理工具,可以直接下载可执行
原创山河已无恙3小时前143阅读点赞评论收藏

本文将给大家分享Java并发编程相关的知识点,具体将对Java常见的并发编程方式和手段进行总结,以便可以从使用角度更好地感知Java并发编程带来的效果。
原创京东云开发者3小时前146阅读点赞评论收藏

软件开发入门教程网Bootstrap4 面包屑导航(Breadcrumb)面包屑导航是一种基于网站层次信息的显示方式。以博客为例,面包屑导航可以显示发布日期、类别或标签。它们表示当前页面在导航层次结构内的位置,是在用户界面中的一种导航辅助。Bootstrap 中的面包屑导航是一个简单的带有 .breadcrumb class 的无序列表。分隔符会通过 CSS(bootstrap
原创雪奈椰子3小时前136阅读点赞评论收藏

一、前言 - webpack热更新​​Hot Module Replacement​​,简称​​HMR​​,无需完全刷新整个页面的同时,更新模块。​​HMR​​的好处,在日常开发工作中体会颇深:节省宝贵的开发时间、提升开发体验。刷新我们一般分为两种:一种是页面刷新,不保留页面状态,就是简单粗暴,直接​​window.location.reload()​​。另一种是基于​​WDS (Webpack-
原创Seattle小小瓜3小时前136阅读点赞评论收藏

1.背景Spring的核心思想就是容器,当容器refresh的时候,外部看上去风平浪静,其实内部则是一片惊涛骇浪,汪洋一片。Springboot更是封装了Spring,遵循约定大于配置,加上自动装配的机制。很多时候我们只要引用了一个依赖,几乎是零配置就能完成一个功能的装配。我非常喜欢这种自动装配的机制,所以在自己开发中间件和公共依赖工具的时候也会用到这个特性。让使用者以最小的代价接入。想要把自动装
原创Seattle小小瓜3小时前135阅读点赞评论收藏

一. pyinstaller和Nuitka使用感受1.1 使用需求这次也是由于项目需要,要将python的代码转成exe的程序,在找了许久后,发现了2个都能对python项目打包的工具——pyintaller和nuitka。这2个工具同时都能满足项目的需要:隐藏源码。这里的pyinstaller是通过设置key来对源码进行加密的;而nuitka则是将python源码转成C++(这里得到的是二进制的
原创LinkSLA3小时前146阅读点赞评论收藏

本文主要讲述了Android客户端模块化开发的痛点及解决方案,详细讲解了方案的实现思路和具体实现方法。
原创vivo互联网3小时前136阅读点赞评论收藏

Original: https://blog.51cto.com/u_11160105/5515026
Author: redrose2100
Title: 设计模式(Python语言)----组合模式



相关阅读1

Title: Python代码阅读(第21篇):将变量名称转换为蛇式命名风格

本篇阅读的代码实现将变量名称转换为蛇式命名风格(snake case)的功能。

snake

from re import sub

def snake(s):
  return '_'.join(
    sub('([A-Z][a-z]+)', r' \1',
    sub('([A-Z]+)', r' \1',
    s.replace('-', ' '))).split()).lower()

# EXAMPLES
snake('camelCase') # 'camel_case'
snake('some text') # 'some_text'
snake('some-mixed_string With spaces_underscores-and-hyphens') # 'some_mixed_string_with_spaces_underscores_and_hyphens'
snake('AllThe-small Things') # "all_the_small_things"

snake函数使用正则表达式将字符串变形、分解成单词,并加上 _作为分隔符组合起来。函数主要使用了 re模块的 substr.replacestr.splitstr.lowerstr.join。在正式分析 snake函数的逻辑之前,先介绍下其中使用到的其他函数的作用。

返回字符串的副本,其中出现的所有子字符串 old都将被替换为 new 如果给出了可选参数 count,则只替换前 count次出现。

返回一个由字符串内单词组成的列表,使用 sep作为分隔字符串。 如果给出了 maxsplit,则最多进行 maxsplit次拆分(因此,列表最多会有 maxsplit+1个元素)。 如果 maxsplit未指定或为 -1,则不限制拆分次数(进行所有可能的拆分)。

如果 sep未指定或为 None,则会应用另一种拆分算法:连续的空格会被视为单个分隔符,开头和结尾如果包含空格的话,将不会拆分出空字符串。 因此,使用 None拆分空字符串或仅包含空格的字符串将返回 []

>>> '1 2 3'.split()
['1', '2', '3']
>>> '1 2 3'.split(maxsplit=1)
['1', '2 3']
>>> '   1   2   3   '.split()
['1', '2', '3']

返回一个由 iterable中的字符串拼接而成的字符串。

返回原字符串的副本,其所有区分大小写的字符均转换为小写。

返回通过使用 repl替换在 string最左边非重叠出现的 pattern而获得的字符串。 如果样式没有找到,则不加改变地返回 stringrepl可以是字符串或函数。 向后引用像是 \6会用样式中第 6组所匹配到的子字符串来替换。 例如下面的例子中第一组匹配到的是 myfun,所以在替换的时候, \1使用 myfun替换,所以在结果中 \npy_后面接着的是 myfun

>>> re.sub(r'def\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*\(\s*\):',
...        r'static PyObject*\npy_\1(void)\n{',
...        'def myfunc():')
'static PyObject*\npy_myfunc(void)\n{'

首先分析一下 snake函数最里面的 sub函数。先看下输入参数。

strings.replace('-', ' ')将待转换的字符串中的 '-'使用 ' '替换。

pattern'([A-Z]+)',其中 (...)表示他是一个组合,匹配括号内的正则表达式,并在匹配完成之后,组合的内容可以被获取,并可以在之后用 \number转义序列进行再次匹配或使用,例如上个例子中的 \1'([A-Z]+)'的组合表示要匹配一个或多个大写字母,并尽可能匹配出最长的子字符串。

replr' \1',代表使用组合匹配出来的字符串前增加一个空格,替换匹配出来的字符串。例如 'abcDEF'经过匹配和替换将变成 'abc DEF'sub('([A-Z]+)', r' \1', 'abcDEF') # 'abc DEF'

因此, snake函数最里面的 sub函数的输出是将原始字符串中的 '-'使用 ' '替换,再匹配字符串中的一个或多个连续的大些字母,在前面增加一个空格。例如原始字符串是 'abc-abcDEF-ABc'经过第一个 sub函数转换后变成 'abc abc DEF ABc'(注意 'ABc'前面有两个空格)。

接下来再分析一下第二层的 sub函数。还是先看一下输入参数。

string是上个 sub的输出,在前面的例子中,是 'abc abc DEF ABc'(注意 'ABc'前面有两个空格)。

pattern'([A-Z][a-z]+)'。它也是一个组合,表示要匹配一个大写字母后面跟着一个或多个小写字母的形式,并尽可能匹配出最长的子字符串。

repl还是 r' \1',代表使用组合匹配出来的字符串前增加一个空格,替换匹配出来的字符串。

因此,第二层 sub的输出是简单的匹配一个大写字母后面跟着一个或多个小写字母的形式,在前面加一个空格。继续使用前面的例子,这层的输入字符串是 'abc abc DEF ABc'(注意 'ABc'前面有两个空格),输出是 'abc abc DEF A Bc'(注意 'A'前面有两个空格)。

然后 snake函数将第二层 sub输出的字符串使用 str.split函数分成字符串列表。再将得到的字符串列表使用 '-'作为分隔符组合起来。最后使用 str.lower将组合后的字符串转换成小写。延续上面的例子,最终输出的字符串为: 'abc_abc_def_a_bc'

Original: https://www.cnblogs.com/felixz/p/15437636.html
Author: FelixZ
Title: Python代码阅读(第21篇):将变量名称转换为蛇式命名风格

相关阅读2

Title: 命令行安装kvm虚拟机

第一步,安装依赖:
yum -y install qemu-kvm libvirt virt-install bridge-utils
第二步,启动libvirt:
systemctl start libvirtd
systemctl enable libvirtd
第三步,配置网桥:1. 新增ifcfg-br0配置文件
[root@localhost images]# cat /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE="br0"
ONBOOT="yes"
TYPE="Bridge"
BOOTPROTO="none"
IPADDR="172.20.186.92"
NETMASK="255.255.248.0"
GATEWAY="172.20.191.253"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
DHCPV6C="no"
STP="on"
DELAY="0"
DNS1=XX
DNS2=XX
2.修改原网卡配置
[root@localhost images]# cat /etc/sysconfig/network-scripts/ifcfg-em1
DEVICE=em1
ONBOOT=yes
BRIDGE="br0"
3.重启网络
systemctl restart network
第四步,安装虚拟机
virt-install --virt-type=kvm --name=clone_src --os-type=linux --os-variant=rhel7 --vcpus=4,maxvcpus=8 --memory=8192,maxmemory=12288 --location=/root/CentOS-7-x86_64-DVD-2009.iso --disk path=/var/lib/libvirt/images/clone_src.qcow2,size=200,format=qcow2 --network bridge=br0 --graphics none --console=pty,target_type=serial --extra-args="console=tty0 console=ttyS0" --force
其中:--location=,表示镜像文件路径(需提前下载)    --disk path=XX,size=,format= 表示虚拟机存储选项   --network bridge= 表示使用哪个网桥然后根据提示进行配置即可

Original: https://www.cnblogs.com/fdzwdt/p/16228556.html
Author: fdzwdt
Title: 命令行安装kvm虚拟机

相关阅读3

Title: 自底向上:从可变对象、不可变对象到深浅拷贝再到数据结构

一、不可变对象和可变对象**

Python 在 heap 中分配的对象分成两类:可变对象和不可变对象。所谓可变对象是指,对象的内容是可变的,例如 list。而不可变的对象则相反,表示其内容不可变。

不可变对象 :int,string,float,tuple   -- 可理解为C中,该参数为值传递
可变对象   :list,dictionary           -- 可理解为C中,该参数为指针传递

不可变对象

由于Python中的变量存放的是对象引用,所以对于不可变对象而言,尽管对象本身不可变,但变量的对象引用是可变的。运用这样的机制,有时候会让人产生糊涂,似乎可变对象变化了。如下面的代码:

for i in range(10):
    print(id(i))

outputs:
    2221403367696
    2221403367728
    2221403367760
    2221403367792
    2221403367824
    2221403367856
    2221403367888
    2221403367920
    2221403367952
    2221403367984

设计模式(Python语言)—-组合模式

从上面得知,不可变的对象的特征没有变,依然是不可变对象,变的只是创建了新对象,改变了变量的对象引用。

对于可变对象

其对象的内容是可以变化的。当对象的内容发生变化时,变量的对象引用是不会变化的。如下面的例子。

m = [1,2,3]
print(id(m))
m += [4]
print(id(m))

outputs:
    2221492412544
    2221492412544

对于可变对象 list这种进行操作时,相当于修改对象中某个属性,所以不会改变地址 python都是将对象的引用(内存地址)赋值给变量的。

现在问题来了

def myfunc(l):
    l.append(1)  # 列表加1
    print(l)
l = [1,2,3]
myfunc(l)   # [1,2,3,1]
print(l)    # [1,2,3,1]

可变对象 l送进函数中操作后,对函数外面的也起作用,不可变对象则相反。因为函数直接对可变对象的 地址的值进行了修改。该操作对于类初始化传值有一样的效果。

只有搞懂可变对象和不可变对象之后,才能理解下面的深拷贝与浅拷贝

二、深拷贝和浅拷贝

浅拷贝

  • 浅拷贝会创建一个新的容器对象(compound object)
  • 对于对象中的元素,浅拷贝就只会使用原始元素的引用(内存地址)

深拷贝

  • 深拷贝和浅拷贝一样,都会创建一个新的容器对象(compound object)
  • 和浅拷贝的不同点在于,深拷贝对于对象中的元素,深拷贝都会重新生成一个新的对象

更进一步,由于浅拷贝复制的是元素的地址引用,如果元素是不可变类型,修改就更新了地址,和原对象的地址不同了,所以原对象不会受到影响,当元素是可变类型,修改没有改变地址,这样原对象也就跟着变化。

对于深拷贝而言,改变任何一个对象都对另一个没有影响,它们是独立的。无论是不可变对象,还是可变对象,深拷贝后它们的地址已经不一样了。

三、哈希表中的可哈希和不可哈希对象

了解了上文之后,在python中使用哈希表(散列表)数据结构时,又有可哈希和不可哈希对象之分,其实这里就是可变对象和不可变对象。为什么呢?

对于不可变类型而言, 不同的值意味着不同的内存,相同的值存储在相同的内存,如果将我们的不可变对象理解成哈希表中的 Key,将内存理解为经过哈希运算的哈希值 Value,这不正好满足哈希表的性质嘛。

对于可变对象而言,比如一个列表,更改列表的值,但是对象的地址本身是不变的,也就是说 不同的 Key,映射到了相同的 Value,这显然是不符合哈希值的特性的,即出现了哈希运算里面的冲突。

所以在python中使用set()、dictionary()时键值都必须是不可变对象。

参考文章:Python基础:Python可变对象和不可变对象

Original: https://www.cnblogs.com/cs-markdown10086/p/16139269.html
Author: NEU_ShuaiCheng
Title: 自底向上:从可变对象、不可变对象到深浅拷贝再到数据结构