浅析函数装饰器与functools.wraps

只要把握住一个概念,使用函数装饰器时就不会被绕晕:函数装饰器就是一个可调用对象,它接受一个参数(一般是函数对象),返回一个可调用对象。

所谓的“带参数的函数装饰器”,其实并不是函数装饰器了,“带参数的函数装饰器”的主要目的是使用参数来制作一个更好的函数装饰器,所以它返回一个函数装饰器。

我们知道functools.wraps可以让被装饰的函数具有原本的元信息(即__name__、__doc__等),它是怎么做到的呢?我们可以实现一个自己版本的简易wraps:

Read More »

Java四种访问控制权限的具体规则

传统讲解:

  • public:对外部完全可见。
  • protected:对本包和所有子类可见。
  • 默认:对本包可见。
  • private:仅对本类可见。

如果你觉得这四句话实在是太过模糊,很多情况下都无法自行判断可见性,而自己又想像IDE插件那样在各种情况下都能看出可见性,那么可以看看下面的具体规则。

Read More »

Python标准库的“三六九等”

我们知道python标准库中有os,sys,string等模块,此时当前路径下有a.py,os.py,sys.py,string.py四个文件,其中除了a.py其余文件都为空,a.py内容如下:

#a.py
import sys
print(sys)
import os
print(os)
import string
print(string)

请问在当前路径运行a.py后,三个print出来的模块路径分别是什么,三个选项:A,当前路径;B,标准库路径;C,都不是。

Read More »

Python3模块包导入内部模块时为何应该使用“包相对导入”

目录
一、使用“绝对导入”代表你想使用外部模块
二、导入内部模块时也不应该使用自己包的名字
三、即使使用了“包相对导入”,也可以直接进行主模块测试

一、使用“绝对导入”代表你想使用外部模块

假设我们是模块包mod的编写者,现在用户的主目录中有a.py,b.py和我们的模块包mod,mod内含有b.py和c.py,目录结构如下:

Read More »

利用数字证书的通信过程

一、基础概念

1,对称加密算法:加密使用的密钥和解密使用的密钥是相同的。

2,非对称加密算法:加密使用的密钥和解密使用的密钥是不相同的。

3,公钥密码体制:一种非对称加密算法,它的公钥和私钥是不同的,也就是说加密使用的密钥和解密使用的密钥不同。它具有三个部分:公钥、私钥、加密解密算法。一般公钥和加密解密算法公开,而私钥保密。通过加密算法和公钥对明文进行加密,得到密文;通过解密算法和私钥对密文进行解密,得到明文。

Read More »

Brainfuck编程语言简介

在1993年,Urban Müller发明了Brainfuck语言(以下简称BF),它一共只含有8个有效字符,每个有效字符就是一条指令,语言虽然极致轻量,它却是一门图灵完备的编程语言。

BF的工作机制与图灵机高度一致。首先它存储数据的方式是一个不限长的一维整数数组(纸带),里面的数值全部初始化为0。此外,有一个数据指针(读写头),每一时刻都指向数组的某一元素,指针可以向左/右移动,也可以读取/修改当前指向的元素的值。

BF语言里的8个有效字符(指令)分别是:

Read More »

C语言数组的范围初始化器

C89标准中,对数组进行初始化时,初始化列表未写全的部分会进行默认初始化,比如:char a[10] = {1, 1, 1};那么数组a中只有前三个元素会被初始化为1,后面7个元素则被默认初始化为0。

C99增加了指定初始化器(designated initializer)的特性:char a[10] = {[5] = 1};那么数组元素a[5]会被初始化为1,其余元素则默认为0。

gcc编译器(包括mingw)对“指定初始化器”语法进行了扩展从而支持“范围初始化器”语法:char a[10] = {[0 ... 4] = 1, [5] = 2, [7 ... 9] = 3};那么a[0]~a[4]=1,a[5]=2,a[6]默认=0,a[7]~a[9]=3。注意“…”两侧都必须有空格。

Read More »