2019-08-14-python-super详解

2019-08-14-python-super详解 Python 【转载】Python: super 没那么简单 转载信息 关于 python super 相关的东西,这篇博客的解释非常易懂,作者思路清晰,对于文中部分不精确的地方,我会适当的加上注释。链接是:Python: super 没那么简单。 目录 前言¶ 约定¶ 单继承¶ 多继承¶ super 是个类¶ 多继承中 super 的工作方式¶ 实现一个 Super 类¶ 总结¶ 参考资料¶ 前言 说到 super, 大家可能觉得很简单呀,不就是用来调用父类方法的嘛。如果真的这么简单的话也就不会有这篇文章了,且听我细细道来。😄 约定 在开始之前我们来约定一下本文所使用的 Python 版本。默认用的是 Python 3,也就是说:本文所定义的类都是新式类。如果你用到是 Python 2 的话,记得继承 object: # 默认, Python 3 class A: pass # Python 2 class A(object): pass Python 3 和 Python 2 的另一个区别是: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx : ...

January 16, 2026

2019-01-23-ssh服务介绍及使用

2019-01-23-ssh服务介绍及使用 Linux [[SSH]] ssh 服务介绍及使用 简介 ssh 是个非常通用的服务,但凡用过 Linux 系统的人就不会没使用过这个工具。 SSH (即 Secure Shell),是一项创建在应用层和传输层基础上的安全协议,为计算机 Shell 提供安全的传输和使用环境。 而 SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。通过 SSH 可以对所有传输的数据进行加密,也能够防止 DNS 欺骗和 IP 欺骗。 SSH 之另一项优点为其传输的数据可以是经过压缩的,所以可以加快传输的速度。SSH 有很多功能,它既可以代替 Telnet,又可以为 FTP、POP、甚至为 PPP 提供一个安全的“通道”。 安装 现在的 ssh 通常指的是开源的OpenSSH,一般而言,Linux 发行版以及 MacOSX 都应该直接可以使用,部分操作系统会默认关闭 ssh 服务。 # Debian 系 Linux 安装 sudo apt-get install openssh-client # openssh 客户端 sudo apt-get install openssh-server # openssh 服务端 开启 ssh 服务: 不同操作系统对于服务的启停并不一致,以 ubuntu 为例 ps -e | grep ssh # 如果看到 sshd 那说明 ssh-server 已经启动了。 # 如果没有则可以这样启动: sudo /etc/init.d/ssh start # 或者 service ssh start 更多其他操作系统的启停,请直接 Google。 ...

January 16, 2026

2019-04-03-redis的安装、配置和数据类型

2019-04-03-redis的安装、配置和数据类型 [[Redis]] [[database]] [[noSQL]] Redis 的安装、配置和数据类型 redis 是一个常用的 NoSQL 工具。它作用在内存,所以速度特别快,同样的,它的可保持性特别差。 优势: 性能极高 – Redis 能读的速度是 110000次/s,写的速度是 81000次/s 。 丰富的数据类型 – Redis 支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。 原子 – Redis 的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过 MULTI 和 EXEC 指令包起来。 丰富的特性 – Redis 还支持 publish/subscribe, 通知, key 过期等等特性。 安装 $ wget http://download.redis.io/releases/redis-5.0.4.tar.gz $ tar xzf redis-5.0.4.tar.gz $ cd redis-5.0.4 $ make 配置 查看配置 Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf。 可以通过 CONFIG 命令查看或设置配置项。 redis 127.0.0.1:6379> CONFIG GET loglevel 1) "loglevel" 2) "notice" 使用 * 号获取所有配置项。 ...

January 16, 2026

2019-08-27-为何你应该使用pathlib

2019-08-27-为何你应该使用pathlib Python Python Module 【翻译】为什么你应该使用 pathlib 原文地址: Why you should be using pathlib 当我刚知道 pathlib 的时候,我起初觉得它很不好用,因为已经有了 os.path 模块做相关的事,但后来证明我错了。pathlib 模块太酷了! 在这篇文章里,我希望能鼓舞你在 Python 代码中任何用到文件地方使用它。 os.path 是笨拙的 os 模块太拥挤了 不要忘记 glob 模块 pathlib 让简单更简单 PATH 类型让你的代码更明确 pathlib 还缺少了什么 你应该使用 pathlib 吗 os.path 是笨拙的 os.path 模块已经深入到了 Python 代码里面。你可以用这个模块做到自己想要的,但有时会显得很笨拙。 你会喜欢下面这种? import os.path BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) TEMPLATES_DIR = os.path.join(BASE_DIR, 'templates') 还是喜欢下面这种? from os.path import abspath, dirname, join BASE_DIR = dirname(dirname(abspath(__file__))) TEMPLATES_DIR = join(BASE_DIR, 'templates') 或者你想对 join 函数重命名,那么就像是: ...

January 16, 2026

2019-12-27-一次奇怪的ip变动

2019-12-27-一次奇怪的ip变动 Linux [[Network]] 一次奇怪的 ip 变动 昨天,根据 Ubuntu 18.4 通用配置脚本 里的方式为一台机器配置了静态地址,但没重启,使用 sudo netplan apply 的方式使得 ip 变动了。 运行的 ok,但在凌晨三点的时候,监控显示连不上了,第二天一连接物理机,发现ip变成了 192.168.1.40。 确定的情况是: 操作系统是 Ubuntu 18.04.3 server ip 变动前跑应用,系统负载比较大 静态配置文件没变动,大致信息为: $ cat /etc/netplan/01-netcfg.yaml network: version: 2 renderer: networkd ethernets: eno1: addresses: [192.168.1.10/24] gateway4: 192.168.1.1 nameservers: addresses: - "192.168.1.1" ip 由 192.168.1.10 变成了 192.168.1.40 没重启过,uptime 结果为运行了 29 天 arp -n 的结果中显示 192.168.1.10 的结果是 at <incomplete> on eno1 ip a 的信息是: 2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 18:66:da:ea:7a:54 brd ff:ff:ff:ff:ff:ff inet 192.168.1.40/24 brd 192.168.1.255 scope global eno1 valid_lft forever preferred_lft forever inet6 fe80::1a66:daff:feea:7a54/64 scope link valid_lft forever preferred_lft forever 排查过程 怀疑使用了 keep alive 但是没找到相关进程以及相关配置文件,可以排出 ...

January 16, 2026

2019-10-14-mongodb的学习(概念篇)

2019-10-14-mongodb的学习(概念篇) database [[MongoDB]] MongoDB 的学习:概念篇 MongoDB 是由 C++ 语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似 JSON 对象,它的字段值可以包含其他文档、数组及文档数组,非常灵活。 安装 Windows 平台安装 MongoDB Linux平台安装MongoDB Mac OSX 平台安装 MongoDB 请注意,macOS 上的 Homebrew 2.1.13 版本无法安装 MongoDB,所以推荐官网下载二进制包。(MongoDB越来越商业化了,官方推荐云端的方式使用)。 概念基础 SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table collection 数据库表/集合 row document 数据记录行/文档 column field 数据字段/域 index index 索引 table joins 表连接,MongoDB不支持 primary key primary key 主键,MongoDB自动将_id字段设置为主键 数据库 一个 mongodb 中可以建立多个数据库。 MongoDB 的默认数据库为"db",该数据库存储在 data 目录中。 MongoDB 的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。 数据库名称规范: 不能是空字符串("")。 不得含有’ ‘(空格)、.、$、/、\和\0 (空字符)。 应全部小写。 最多64字节。 有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。 ...

January 16, 2026

2019-10-15-mongodb的学习(增删改查篇)

2019-10-15-mongodb的学习(增删改查篇) database MongoDB MongoDB 的学习:增删改查篇 数据库 创建数据库 > use DATABASE_NAME 如果数据库不存在,则创建数据库,否则切换到指定数据库。 查看数据库 > show dbs admin 0.000GB config 0.000GB local 0.000GB test 0.000GB 删除数据库 > use test > db.dropDatabase() 集合 创建集合 > db.createCollection(name, options) options: 字段 类型 描述 capped 布尔 (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。 autoIndexId 布尔 (可选)如为 true,自动在 _id 字段创建索引。默认为 false。 size 数值 (可选)为固定集合指定一个最大值,以千字节计(KB)。 max 数值 (可选)指定固定集合中包含文档的最大数量。 > db.createCollection("mycol", {capped: true, autoIndexId: true, size: 6142800, max: 10000 } ) { "ok" : 1 } 查看集合 > show collections student teacher > show tables student teacher 删除集合 > db.{collection_name}.drop() > db.student.drop() > show tables teacher 文档 插入文档 > db.COLLECTION_NAME.insert(document) > data = ({tid: 1, name: "test1"}) { "tid" : 1, "name" : "test1" } > db.temp.insert(data) WriteResult({ "nInserted" : 1 }) > db.temp.find() { "_id" : ObjectId("5da45bb6b34ebdef7f4e2c98"), "tid" : 1, "name" : "test1" } 删除文档 > db.collection.deleteMany( <filter>, { writeConcern: <document>, collation: <document> } ) > db.collection.deleteOne( <filter>, { writeConcern: <document>, collation: <document> } ) filter :(可选)删除的文档的条件。 collation : (可选)指定 用于操作的排序规则 writeConcern :(可选)抛出异常的级别。 collation: { locale: <string>, caseLevel: <boolean>, caseFirst: <string>, strength: <int>, numericOrdering: <boolean>, alternate: <string>, maxVariable: <string>, backwards: <boolean> } 删除集合下全部文档: db.inventory.deleteMany({}) 删除 status 等于 A 的全部文档: db.inventory.deleteMany({ status : "A" }) 删除 status 等于 D 的一个文档: db.inventory.deleteOne( { status: "D" } ) 更新文档 > db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } ) query : update的查询条件,类似sql update查询内where后面的。 update : update的对象和一些更新的操作符(如$,$inc…)等,也可以理解为sql update查询内set后面的 upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。 multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。 writeConcern :可选,抛出异常的级别。 查询文档 db.collection.find(query, projection) query :可选,使用查询操作符指定查询条件 projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。 MongoDB 与 RDBMS Where 语句比较 ...

January 16, 2026

2019-01-27-pdb调试代码

2019-01-27-pdb调试代码 [[Python]] PDB 调试代码 这里的 pdb 可不是「可插拔数据库」,而是 Python 自带的一个调试工具,有点类似于 GNU 的 gdb。 gdb 调试 C/C++ 的代码, 而 pdb(The Python Debugger) 则用来调试 Python 代码。 pdb 至少有三种使用方式去调用,每种调用方式对应着不同的场景,但是进入调试模式后的操作逻辑相似。 通过 -m pdb 调用 通过 pdb.run() 调用 通过pdb.set_trace() 进入到调试界面 通过 -m pdb 调用 针对一些小型的,只有单个文件的模块(即*.py文件),可以使用 python -m pdb my_module.py 的方式进入到 pdb 调试模式。 # file name: test.py def sum(a, b): print a print b return a+b if __name__ == "__main__": a = 100 b = 200 c = sum(a, b) print c 通过 -m pdb 调用会停住在「模块文件中除注释外的第一行」,在这里就是函数签名。 ...

January 16, 2026

2019-07-26-C语言\^及\&两个示例

2019-07-26-C语言^及&两个示例 C C 语言 ^ 及 & 两个示例 C 语言中通过运算符异或 ^ 来交换两个数的值,而且不引入其他变量。 #include "stdio.h" int main(){ int a=45, b=30; printf("原数据是a=%d, b=%d", a, b); a = a^b; b = a^b; /*b1 = (a^b)^b*/ a = a^b; /*a1 = (a^b)^((a^b)^b)*/ printf("交换后a=%d, b=%d\n", a, b); } 输出结果: 原数据a=45,b=30 交换后a=30,b=45 手算: a = 45 = 0b101101 b = 30 = 0b11110 a = a^b = 0b101101^0b011110 = 0b110011 b = a^b = 0b110011^0b11110 = 0b101101 = 45 a = a^b = 0b110011^0b101101 = 0b11110 = 30 利用位与 & 运算,判断一个整数是否是 2 的整数次幂。 #include "stdio.h" int judge(int num){ if( ( num>0 ) && ( (num&(num-1) ) == 0)){ printf("%d是2的整幂次方。\n", num); } else{ printf("%d不是2的整幂次方。\n", num); } return 0; } int main(){ judge(100); judge(64); judge(33); judge(16); return 0; } 输出结果: ...

January 16, 2026

2022-09-07-乐观锁和悲观锁

2022-09-07-乐观锁和悲观锁 database 乐观锁和悲观锁 乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题。 乐观锁:乐观锁在操作数据时非常乐观,认为别人不会同时修改数据。因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作。 悲观锁:悲观锁在操作数据时比较悲观,认为别人会同时修改数据。因此操作数据时直接把数据锁住,直到操作完成后才会释放锁;上锁期间其他人不能修改数据。 乐观锁本质上不是锁,而是通过其他方式对数据竞争问题进行求解;悲观锁一般通过上锁的方式解决数据竞争问题,适用的场合更多。 乐观锁两个解决方案: CAS 版本号机制 CAS compare and swap。 需要读写的内存位置(V) 进行比较的预期值(A) 拟写入的新值(B) CAS操作逻辑如下:如果内存位置V的值等于预期的A值,则将该位置更新为新值B,否则不进行任何操作。许多CAS的操作是自旋的:如果操作不成功,会一直重试,直到操作成功为止。通过 CPU 的指令实现原子性。 版本号机制 对数据增加一个新的字段,通过对这个字段的解读判断数据是否被修改。其实是类似于 CAS,但是 CAS 关注的是数据的本身,可能存在 ABA 问题,而版本号机制就不会出现该问题。 适用场景 竞争不激烈:乐观锁,对于数据不会进行锁的操作,提升程序运行效率 竞争激烈:悲观锁,虽然锁会有性能损耗,但是竞争激烈情况下,乐观锁的实现会更麻烦 CAS 的缺点 ABA 问题:当前的值已经经历过一次变动,但CAS无感知 高竞争的开销问题:CAS会不断的尝试,消耗CPU资源 功能限制:不支持多个变量的操作;需要CPU的支持

January 16, 2026