0%

本文以MacOS docker desktop为例。

下载安装MacOS版docker desktop

  1. 下载地址

  2. 双击安装 Docker.dmg

创建etcd3目录

  1. 创建一个目录用于运行docker etcd3,如:/path/to/etcd3

  2. 在如上目录内创建 docker-compose.yml 文件,内容如下:

阅读全文 »

本文将简要介绍火爆全网的NLP对话AI:ChatGPT的注册使用教程。

1、使用dl工具,使用全局模式,选us节点

2、打开Chrome浏览器无痕模式

3、访问 OpenAI ChatGPT 入口:https://chat.openai.com/auth/login

4、填写非国内邮箱地址

5、使用短信接收平台验证:https://sms-activate.org/

6、注册完成后,登录截图如下:

JS装饰器是ES7的新语法,浏览器,nodejs不一定支持,需要babel转译。

实验环境

创建一个目录test,结构为:

1
2
3
4
5
6
7
.
├── .babelrc
├── .npmrc
├── lib
├── package.json
└── src
└── index.js

babel的装饰器配置:

阅读全文 »

元编程

什么是元编程?

用代码来生成代码,或者说,用程序来生成程序,就叫元编程。Python能通过反射实现元编程。

什么是元类?

与元编程相关的一个概念是元类。什么是元类呢,具体到Python,用来创建类的类,就叫元类。元类是制造类的工厂。

在Python中,一个普通类创建出来的东西是类的实例,实例是一个对象。而元类也是一种类,它创建出来的东西是另一个普通类,普通类也是一个对象(Python中一切皆对象),然后这个普通类,又可以创建出类的实例。所以说,元类是类的类。它们的构建过程如下图:

Python中:

1、所有非object类都继承自object类(包括type)
2、所有类的类型都是type(包括type、object、元类)
3、type类继承自object(符合第1句)

虽然type也继承自object,但是我们自己写的类,继承自object与继承自type,会有些不同。

type元类

type这个类,不仅可以获取Python中对象的类型,比如type(123),会告诉你123是int类型(int也是类)。

type也可以作为元类,来构建其他类。语法是:

type(name, bases, dict) -> a new type 返回一个新的类型

阅读全文 »

属性:这里表示类(或类的实例)中的变量与方法的统称。

所以搜索顺序包括:类的属性搜索顺序、类的实例的属性搜索顺序。

下面是所有魔术方法同时出现的情况下,类或实例的属性搜索顺序。

默认搜索顺序

对于类,比如查找A.x。A是类,x是类的属性。

类属性的默认搜索顺序:A自己的x(即A的属性字典__dict__) ⟶ A的父类的x [1] ⟶ 父类的父类的x… ⟶ object的x

对于类的实例,比如查找a.x。a是A的实例,x是实例的属性。

实例的默认搜索顺序:a自己的x(即a的属性字典__dict__)⟶ a从父类的构造方法(__new__, __init__)继承来的属性 ⟶ A自己的x ⟶ A的父类的x [1] ⟶ 父类的父类的x… ⟶ object的x

[1]:

如果A是单继承,直接不断向上找父类。如果A是多继承,由Python3的mro生成一个有序的继承列表,依次找父类。

相关的魔术方法

与搜索顺序相关的魔术方法有:

1、反射相关的:__getattr__, __setattr__, __delattr__, __getattribute__

2、描述器相关的:__get__,__set__,__delete__

下面是所有魔术方法同时出现的情况下,类或实例的属性搜索顺序:

阅读全文 »

装饰器

要讲清楚装饰器,首先要知道一些前置概念。下文涉及到这些概念的地方,会展开讲述。

什么是装饰器?

装饰器是一种AOP(面向切面编程)的设计模式。

面向对象编程往往需要通过继承或组合依赖等方式调用一些功能,这样可能造成代码的重复,增加了耦合。

而AOP可以在需要的类或方法上切入,切入点可以增强功能,让调用者与被调用者解耦。

这种不修改原来的业务代码,给程序动态添加(或修改)功能的技术,就是装饰器

装饰器可用于日志记录、监控、参数检查等地方。比如业务函数中不应该包含与业务无关的功能,那么可以构建一个logger装饰器,对业务函数增加日志功能。并且logger装饰器可以是通用的,需要日志功能的地方,都可以使用logger装饰器,达到复用的目的。

装饰器的分类

无参数装饰器:无参数装饰器实现的关键是“闭包”,即嵌套函数与自由变量。

带参数装饰器:带参数装饰器实现的关键是“柯里化”,多层嵌套函数可以实现柯里化。

什么是闭包?

在讲什么是闭包前,需要先讲一个概念:自由变量。什么是自由变量呢?

未在本地作用域中定义,就是出现在嵌套函数中,定义在某函数的外层函数的作用域中的变量,叫自由变量

如果某函数(即内层函数)引用了外层函数的自由变量,这样就形成了闭包

阅读全文 »

描述器

什么是描述器?

一个类中定义了如下一个或多个魔术方法,这个类的实例就是描述器:

__get__,__set__,__delete__

通常需要两个类来构建描述器:

如果类B的类属性x,指向另一个类A的实例。被指向的A的实例就是描述器对象。B.x是描述器,B也是描述器的属主(owner)。比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
class A:
def __get__(self, instance, owner):
pass

def __set__(self, instance, value):
pass

def __delete__(self, instance):
pass

class B:
x = A() # x是描述器
pass

类属性的值,通常是一些已有类型的对象,比如字符串、列表等。

当使用了描述器,类属性就指向一个描述器对象,描述器通过三个魔术方法,可以自定义属性的行为。

阅读全文 »

查看Python的浮点数如何在内存中存储

下面的探讨主要针对Python3,在Python2中不一定适用。

Python的浮点数实现原理:
CPython实现有一个PyFloatObject的结构体,用来构造Python的浮点数类型:

typedef struct {
PyObject_HEAD # 这个对象包含:引用计数+对象类型,占8+8=16字节
double ob_fval; # 这个是存储浮点数的地方,Python的浮点数就是C的double,双精度
} PyFloatObject;

所以Python的浮点数类型占24字节:
引用计数+对象类型+双精度浮点数 = 8+8+8 = 24字节
不过Python3的整数长度无限,所以占字节数不定

用Python代码验证浮点数:

代码:

阅读全文 »

课程设计2

题目见 汇编语言 第四版 作者王爽 p312

这篇文章是《汇编语言 第四版》的完结篇。

概述

1、vm虚拟机中安装win98se,以下称为win98

2、成功安装系统后,虚拟机添加一个新软盘(需要创建软盘映像.img文件)。

3、启动win98系统,将下文源码编译,然后执行程序(需要masm汇编器)。

4、关闭win98系统,在虚拟机中,设置软盘为启动盘。

5、启动虚拟机,我们自己写的程序就能执行了。

如果用两个硬盘,即添加新硬盘代替软盘,然后设新硬盘为启动盘后,启动失败(暂不管此问题)!

程序结构

软盘:第1扇区存放我们的引导程序,第2-3扇区存放主程序,实现4个功能。

硬盘1:是win98系统盘,第1扇区有mbr引导程序。

开机后,软盘为启动盘,加载我们自己的引导程序,执行引导程序,然后加载2-3扇区的主程序。

内存结构

阅读全文 »