前端转 AI 100 天 Day 4:面向对象,class 和 JS class 的异同

地图打印与 GeoTIFF 导出:框选区域、矢量标绘、一键出图 空间智能实验室 Vol.19:地图打印与 GeoTIFF 导出:框选区域、矢量标绘、一键出图 「把这块区域导成一张带地理坐标的高清图」是个很朴素的需求,但朴素不等于简单。你要在浏览器里框一个框、画几个箭头标个文字、叠一层 阅读详情

前端转 AI 第 4 天:面向对象,class 和 JS class 的异同

昨日回顾

Day 3 把函数这块啃完了,*args / **kwargs 也理解了,作用域也搞清楚了 global 和 nonlocal。

今天进入面向对象。前端看到 class 应该不陌生,ES6 之后我们写 React 组件、写工具类都是 class。所以一开始我以为今天会很轻松,结果——Python 的 class 比 JS 复杂得多,但也强得多。

Day 4 目标:搞懂 class 基本写法,能吃透 self、继承、魔法方法。


一、最基础的 class

先看 JS:

class User {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
  greet() {
    return `我是${this.name},今年${this.age}岁`;
  }
}

const u = new User("前端", 25);
console.log(u.greet());

Python:

class User:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def greet(self):
        return f"我是{self.name},今年{self.age}岁"

u = User("前端", 25)
print(u.greet())

逐行对比:

对比项JavaScriptPython
定义class User {}class User:
构造函数constructor()__init__()
实例引用thisself(显式写在参数里)
创建实例new User()直接 User(),不用 new
方法定义greet() {}def greet(self):
属性赋值this.x = xself.x = x

三个必须记住的点

1. self 是显式的,而且必须是第一个参数

JS 里 this 是隐式的、上下文决定的,会跟着调用方式变。
Python 里 self 就是第一个参数,写死在方法签名里:

class User:
    def greet(self):   # self 就是"调用这个方法的那个实例"
        return self.name

u = User()
u.greet()
# 等价于 User.greet(u)

换句话说,u.greet() 和 User.greet(u) 是同一个东西。这个认知很重要。

2. 创建实例不用 new

u = User("前端", 25)   # ✅
u = new User(...)     # ❌ 语法错误

Python 里 User(...) 这种"调用类"的操作,会自动帮你 new 一个实例、调 __init__、返回对象。不用你操心。

3. 属性必须在 __init__ 里初始化

JS 里可以随便 this.x = 1,Python 里建议所有属性都在 __init__ 里赋值一次,否则后面访问会 AttributeError。

class User:
    def __init__(self, name):
        self.name = name

u = User("前端")
print(u.age)   # ❌ AttributeError: 'User' object has no attribute 'age'

JS 会给你 undefined,Python 直接报错。Python 更严格,也更省心——错误早暴露比晚暴露好。

二、继承:和 JS 差不多,但有细节

JS:

class Animal {
  constructor(name) {
    this.name = name;
  }
  speak() {
    return `${this.name} 发出了声音`;
  }
}

class Dog extends Animal {
  constructor(name, breed) {
    super(name);
    this.breed = breed;
  }
  speak() {
    return `${super.speak()}:汪汪`;
  }
}

Python:

class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        return f"{self.name} 发出了声音"


class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)
        self.breed = breed

    def speak(self):
        return f"{super().speak()}:汪汪"

几乎一模一样,区别:

  • JS 是 class Dog extends Animal
  • Python 是 class Dog(Animal):,父类写在括号里

多继承:Python 支持,JS 不支持

这是 Python 的一个大杀器:

class Flyable:
    def fly(self):
        return "我在飞"

class Swimmable:
    def swim(self):
        return "我在游泳"

class Duck(Flyable, Swimmable):
    pass

d = Duck()
print(d.fly())     # 我在飞
print(d.swim())    # 我在游泳

JS 里这个要靠 mixin 手搓,Python 原生支持。

但别高兴太早,多继承有个坑叫 MRO(方法解析顺序)。后面用到再说,先记住有这回事:多个父类有同名方法时,Python 会按 MRO 顺序找,可以用 Duck.__mro__ 查看。

三、魔法方法:Python 最迷人的地方

JS 里想自定义对象的行为,比如 toString,你得写 toString() 方法;想让它可迭代,得实现 Symbol.iterator。

Python 用双下划线方法(俗称 dunder method)统一了这套机制。

1. __str__:打印对象时显示什么

class User:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f"User({self.name}, {self.age})"

u = User("前端", 25)
print(u)          # User(前端, 25)

不用 __str__ 的话,打印出来是 <__main__.User object at 0x...>,根本看不懂。

JS 类比: toString(),但 JS 的 console.log 不调它,Python 的 print 会调。

2. __repr__:开发调试时显示什么

class User:
    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return f"User(name={self.name!r})"

区别:__str__ 给用户看,__repr__ 给开发者看。
如果只写一个,写 __repr__,因为 print 时找不到 __str__ 会 fallback 到 __repr__。

3. __len__:让对象支持 len()

class Playlist:
    def __init__(self, songs):
        self.songs = songs

    def __len__(self):
        return len(self.songs)

p = Playlist(["歌1", "歌2", "歌3"])
print(len(p))   # 3

JS 类比: JS 里没有这种能力,arr.length 是属性不是方法。

4. __call__:让实例可以像函数一样调用

class Adder:
    def __init__(self, n):
        self.n = n

    def __call__(self, x):
        return x + self.n

add5 = Adder(5)
print(add5(10))   # 15

这个在 Agent 开发里很有用——把"有状态的函数"封装成一个对象,但它又长得像函数。很多 LangChain 的工具就是这么写的。

5. __eq__:自定义相等

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

p1 = Point(1, 2)
p2 = Point(1, 2)
print(p1 == p2)   # True(不写 __eq__ 会 False)

注意:写了 __eq__ 后,对象就不可哈希了,不能放进 set / dict 的 key。如果还想可哈希,要补一个 __hash__。

6. 常用魔法方法速查表

魔法方法作用JS 类比
__init__构造constructor
__str__print 显示toString
__repr__调试显示inspect
__len__len()无
__call__实例可调用无
__eq__==equals 思路
__lt__<valueOf
__getitem__obj[key]Proxy 思路
__iter__for...inSymbol.iterator
__enter__ / __exit__with 语句无

这张表不用背,但要知道有它们存在。 后面遇到的时候再回来看。

四、@property:把方法当属性用

JS 里有 getter:

class User {
  constructor(first, last) {
    this.first = first;
    this.last = last;
  }
  get fullName() {
    return `${this.first} ${this.last}`;
  }
}

Python 用 @property:

class User:
    def __init__(self, first, last):
        self.first = first
        self.last = last

    @property
    def full_name(self):
        return f"{self.first} {self.last}"

u = User("张", "三")
print(u.full_name)    # 张三,注意不加括号!

为什么用? 计算属性 + 数据校验:

class Circle:
    def __init__(self, radius):
        self._radius = radius

    @property
    def radius(self):
        return self._radius

    @radius.setter
    def radius(self, value):
        if value < 0:
            raise ValueError("半径不能为负")
        self._radius = value

c = Circle(5)
print(c.radius)      # 5
c.radius = 10        # 走 setter
# c.radius = -1      # ❌ ValueError

_radius 前面加下划线是 Python 的约定:表示"私有属性,别直接碰"。注意只是约定,不是强制的。

五、实战练习:ChatMessage 类

用今天的知识写一个模拟对话数据结构的类。这个类在后面的 Agent 开发里会反复出现。

新建 day04/chat_message.py:

from datetime import datetime


class ChatMessage:
    """一条对话消息"""

    def __init__(self, role: str, content: str):
        if role not in ("system", "user", "assistant", "tool"):
            raise ValueError(f"不支持的 role: {role}")
        self.role = role
        self.content = content
        self.timestamp = datetime.now()

    def __str__(self):
        t = self.timestamp.strftime("%H:%M:%S")
        return f"[{t}] {self.role}: {self.content}"

    def __repr__(self):
        return f"ChatMessage(role={self.role!r}, content={self.content!r})"

    def __eq__(self, other):
        if not isinstance(other, ChatMessage):
            return False
        return self.role == other.role and self.content == other.content

    def to_dict(self):
        """转成 OpenAI API 需要的格式"""
        return {"role": self.role, "content": self.content}


class Conversation:
    """一个对话,由多条 ChatMessage 组成"""

    def __init__(self, system_prompt: str = ""):
        self.messages = []
        if system_prompt:
            self.messages.append(ChatMessage("system", system_prompt))

    def add_user(self, content: str):
        self.messages.append(ChatMessage("user", content))
        return self

    def add_assistant(self, content: str):
        self.messages.append(ChatMessage("assistant", content))
        return self

    def __len__(self):
        return len(self.messages)

    def __iter__(self):
        return iter(self.messages)

    def __str__(self):
        return "\n".join(str(m) for m in self.messages)

    def to_payload(self):
        """转成 API 请求体"""
        return [m.to_dict() for m in self.messages]


# ============ 测试 ============
if __name__ == "__main__":
    conv = Conversation(system_prompt="你是一个简洁的助手")
    conv.add_user("你好").add_assistant("你好,有什么可以帮你?")
    conv.add_user("介绍一下 Python")

    print("===== 对话内容 =====")
    print(conv)

    print("\n===== 消息数量 =====")
    print(len(conv))

    print("\n===== 遍历 =====")
    for msg in conv:
        print(f"  {msg.role}: {msg.content}")

    print("\n===== API 载荷 =====")
    print(conv.to_payload())

运行结果:

===== 对话内容 =====
[14:23:05] system: 你是一个简洁的助手
[14:23:05] user: 你好
[14:23:05] assistant: 你好,有什么可以帮你?
[14:23:05] user: 介绍一下 Python

===== 消息数量 =====
4

===== 遍历 =====
  system: 你是一个简洁的助手
  user: 你好
  assistant: 你好,有什么可以帮你?
  user: 介绍一下 Python

===== API 载荷 =====
[{'role': 'system', 'content': '你是一个简洁的助手'},
 {'role': 'user', 'content': '你好'},
 {'role': 'assistant', 'content': '你好,有什么可以帮你?'},
 {'role': 'user', 'content': '介绍一下 Python'}]

这个类用到了今天所有知识点:

  • __init__ 初始化
  • __str__ / __repr__ 自定义显示
  • __eq__ 自定义相等
  • __len__ / __iter__ 支持 len() 和 for
  • 继承(ChatMessage 换成别的角色也能用)
  • 方法链(add_user 返回 self)

重点:这个类不是练手,是真正的 Agent 项目起点。 后面调大模型 API 时,请求体就是这个 to_payload() 的样子。

六、今日踩坑

  1. 忘写 self → def greet(): 报错,方法必须 def greet(self):
  2. 调用方法忘加括号 → u.greet 拿到的是函数对象,u.greet() 才是执行
  3. __eq__ 写了但对象不能哈希 → 想放进 set 要补 __hash__
  4. __init__ 里没赋值的属性 → 后面访问报 AttributeError
  5. 类变量和实例变量搞混:
    class A:
        x = 1           # 类变量,所有实例共享
        def __init__(self):
            self.y = 2  # 实例变量,每个实例一份
    

七、今日总结

今天最关键的三件事:

  1. self 是显式的第一个参数,不是 this。方法调用 u.greet() 等于 User.greet(u)
  2. 魔法方法让对象能像内置类型一样被使用:能 print、能 len、能 for、能 ()
  3. @property 把方法当属性用,比 JS getter 更强大(能带校验)

一个感受:

JS 的 class 是"语法糖",Python 的 class 是"真的一等公民"。
前者更多是为了兼容 Java 用户的习惯,后者是语言核心的一部分。

后面写 Agent 时你会发现,几乎所有框架(LangChain、LlamaIndex)都是围绕 class 组织起来的。今天这课打好底子,后面会省很多力。

Day 4 完成度:✅

明日预告(Day 5)

  • 文件读写:open / with / 编码处理
  • 异常处理:try/except/finally / 自定义异常
  • 路径操作:os / pathlib
  • 小练习:写一个日志记录器(写文件 + 异常处理)

最后

如果这篇对你有用,点个赞让我知道有人在看。

有问题评论区见,我们第 5 天继续。

100 天,第 5 天见。


附:系列目录(持续更新)

天标题
01从切图仔出发,100 天走向 Agent 开发 ✅
02list / dict / 推导式,Python 比 JS 爽在哪 ✅
03函数、参数、作用域:别再写 function 了 ✅
04面向对象:class 和 JS class 的异同 ✅
05文件读写与异常处理
06pip / conda / 虚拟环境,彻底搞懂依赖管理
07requests 爬虫实战:抓一个 API
08异步 asyncio:Promise 的另一种形态
……
31FastAPI 入门:写第一个接口
46调通第一个大模型 API
61RAG 实战:让模型读懂你的文档
81LangChain Agent:让模型自己调工具
100上线我的第一个 AI Agent 应用
等时替代模型( Isotemporal Substitution Model) 文献阅读:Associations of sedentary time and physical activity with adverse health conditions: Outcome-wide analyses using isotemporal substitution model(该论文于2022年4月28日发表在柳叶刀子刊 EClinicalMedicine 上) 阅读详情

相关推荐

腾讯云服务器被攻击,带宽被占满的抗战日记

故事 时间:2021-08-23 地点:腾讯云服务器 事件:服务器内容被黑,修复后某人气不过,开始DDOS,占满服务器的带宽,导致网站访问非常缓慢。 杂记 根据腾讯云后台+宝塔后台,带宽被占满:(小垃圾水管没办法) 部分参考:记一次阿里云服务器ECS流出带宽占满的解决过程 https://blog.youkuaiyun.com/wangzhihao1994/article/details/99563456 首先是在云主机上使用远程连接访问到云主机,安装iftop工具 CentOS .

Rudon滨海渔村的博客 1303

【项目推荐】基于 SpringBoot3 + Spring AI 的游泳馆管理系统:Agent + RAG + Function Calling 一次学全

它不是玩具 Demo,而是一个「业务 + AI」双主线交织的真实系统——预约业务在跑,AI 客服在旁边实时查库作答,两条线通过 Function Calling、RAG、站内消息串成一体。面试官问「你做过什么 AI 项目」时,你能从业务场景讲到架构取舍,从 RAG 切分参数讲到降级兜底——这和「我调了一下 ChatGPT 的 API」是完全不同的两个段位。项目已包含完整的建表 SQL、初始化数据、部署文档,克隆下来就能跑。获取方式:见文末说明 / 后台回复关键词获取。—— 完 ——

深耕开发,专注编程实战。分享源码解析、项目搭建、问题排查笔记,沉淀技术,持续更新。 347

【学习路线】 游戏客户端开发入门到进阶

游戏开发是一个交叉性极强的技术领域,对开发者提出了高维度的要求。作为初学者,不要急于求成,打牢基础、注重原理、勤于实践,你的成长将会非常快速而稳健。希望这份学习路线与书单能为你指明方向,迈出职业开发者的第一步。

hhw_hhw的博客 2128

Web 版翻译者资料库

本项目是桌面版《翻译者资料库》的 Web 移植版,基于 Spring Boot 3.3、Thymeleaf、Bootstrap 5.3 与 MySQL 8.0 构建。它面向翻译写作提供资料、词汇、句库、文本工具、对照制作、查找、备份恢复及旧库迁移等功能,完整继承桌面版核心业务规则,支持一键启动与离线访问。

howard2005的专栏 140

JSBSim开发手册:飞机仿真模型开发指南

JSBSim是一款开源的飞行动力学模型仿真引擎,支持多种飞行器的仿真,包括固定翼飞机、直升机、无人机等。JSBSim的设计目标是提供一个灵活、高效、精确的飞行动力学仿真环境。飞行动力学仿真:实现飞行器的动力学仿真,包括空气动力学、发动机、质量和惯性等模型。控制系统仿真:实现飞行器的控制系统仿真,包括自动驾驶仪、飞控系统等。环境仿真:模拟飞行环境,包括大气模型、风力模型等。本文详细介绍了如何使用C++进行JSBSim开发,包括系统设计、模型实现、代码优化和性能调优等方面的内容。

qq_38334677的博客 4526

SAP FAGLFLEXT 是 SAP 新总账的核心余额表,存储多维度的汇总余额数据。核心结论:该表按 “科目 + 会计年度 + 期间 + 维度” 存储累计余额,字段可分为基础标识

FAGLFLEXT是SAP新总账的核心余额表,采用"科目+年度+期间+维度"结构存储多维汇总数据。其字段分为基础标识(科目、年度等)、维度细分(公司代码、利润中心等15个维度)、金额数值(本外币余额)、辅助控制(状态标识)四大类,支持新总账的灵活核算。该表通过凭证自动更新,与旧总账GLT0相比显著扩展了维度核算能力,各维度需在科目主数据或Ledger配置中启用才能使用。

金牌架构师 454

2026小红书小工具怎么制作:纯前端 ZIP 打包、沙箱限制与笔记挂载流程

小红书小工具制作的核心不是复杂开发,而是把需求压缩成纯前端轻交互,并按平台要求完成 ZIP 交付。适合做的方向是测试、计算器、生成器、学习小测和记录工具;不适合做的方向是账号体系、云端数据、支付和远程接口。制作时先确认沙箱限制,再整理输入、计算、输出链路,最后通过 Builder Hub 提交审核并挂载笔记。在需求简单、素材较少的情况下,十几分钟做出一个可用的小工具是现实路径,袋马就是一个选择。

qq_39308835的博客 291

ARM系统控制和管理接口System Control and Management Interface

本文档描述了一个可扩展的独立于操作系统的软件接口,用于执行各种系统控制和管理任务,包括电源和性能管理。 本文档描述了系统控制和管理接口(SCMI),它是一组操作系统无关的软件接口,用于系统管理。

AI-安全-功耗 1913

Agent 的 ReAct、Plan、Execute、Reflection 模式

本文系统解析 Agent 的 ReAct、Plan、Execute、Reflection 四模式,揭示其核心为“下一步谁定”与“错了怎么发现”两大问题。ReAct 逐步决策,适合动态环境但易冗余;Plan 一次性规划,高效却惧变化;Execute 严格落地,需明确判据与失败策略;Reflection 事后校验,强化纠错闭环。四者协同:外层规划,执行中嵌入思考,每步后反思,连续失败才重规划,构建稳定可控的智能体工作流。

2401_89855466的博客 325

完整 Bootloader 框架

本文详细介绍了嵌入式系统中Bootloader的完整框架设计。主要内容包括:1.Bootloader的核心功能模块,如应用启动、命令交互、下载功能、Flash烧写和调试维护;2.模块化设计框架,包含启动代码、驱动层、协议实现等组件;3.典型工作流程和关键模块实现,如命令行接口、命令注册机制、Flash操作等;4.应用跳转前的准备工作和安全扩展设计,如加密校验、OTA支持等。文章强调了一个成熟Bootloader在系统维护、升级和安全中的重要性,建议采用模块化、可扩展的设计方法。

m0_49476241的博客 1337

【数据集】基于ubESTARFM法的100m 地温LST数据集(澳大利亚)

【数据集】基于ubESTARFM法的100m 地温LST数据集(澳大利亚)

WW、forever的博客 265

海外平台频繁弹验证?从 DNS、WebRTC 到浏览器指纹的环境异常排查清单

在运营多地区海外平台账号时,即使代理节点通畅、TCP 握手成功,仍可能遇到频繁人机验证、地区限制、播放失败等异常。核心结论是:这类问题往往不在网络传输层,而在浏览器环境参数与网络出口之间的逻辑自洽性。本文从 DNS 泄漏、WebRTC 穿透、时区与语言匹配、Canvas/WebGL 指纹、TLS 特征五个维度,给出一份可复现的环境异常排查清单,并对比个人手动配置与工程化环境管理方案的适用边界。适用于跨境运营、多账号运维团队。

P1Browser【p1指纹浏览器】的博客 183

Ubuntu 系统下安装 OpenClaw(原 Clawdbot)的详细指南

Ubuntu 系统下安装 OpenClaw(原 Clawdbot)的详细指南

Science prince的博客 3535

信号链电路怎么选运放?奥特四款信号链运放解析【选型参考】

在模拟电路设计中,运放作为信号链的“第一道门槛”,其微小误差往往决定了整个系统的成败。

naNa_1120的博客 191

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

智能问诊的流程

本文介绍基于FastAPI构建的医疗多Agent系统MediAgent,通过症状分析、诊断推理与治疗建议等模块协同,实现从问诊到报告生成的完整工作流。系统采用前后端分离架构,结合MySQL、RabbitMQ与Docker实现工程化部署,支持异步化验结果接入。虽当前状态暂存于内存,但已具备可扩展性,未来可通过Redis持久化、消息队列联动及医疗安全机制完善,应用于慢病管理、辅助决策等场景,推动AI在医疗流程中的落地应用。

Joey 的工作空间~ 772

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

流式输出 SSE:实现 AI 对话打字机效果后端开发

摘要解决传统 HTTP 请求在 LLM 长文本生成时导致的客户端长时间阻塞与 TTFT 极高的问题。适用于需为 AI 应用提供打字机效果、优化交互体验的后端开发工程师。读完可获得基于 FastAPI 与 SSE(Server-Sent Events)技术的流式响应实现代码、协议规范及生产环境避坑指南。关键词SSE、流式输出、FastAPI、打字机效果、TTFT、大模型推理背景与问题大模型(LLM)生成完整回复通常耗时数秒至数十秒,传统请求-响应模型导致用户界面长时间无响应,体验极差。

2402_85729970的博客 178

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Vue-Router

本文详解前端路由原理与实现,以网易云音乐为例,介绍通过 vue-router 实现页面无刷新切换。核心步骤包括:安装模块、创建路由实例、注册应用、配置页面组件与路由出口。使用 router-link 实现声明式导航,结合 query 和 params 传参,支持模糊与精确匹配激活状态。强调 useRoute(读取参数)与 useRouter(执行跳转)的区别,帮助开发者掌握单页应用路由的核心机制。

2301_79245606的博客 343

基于 YOLOv8 的森林火灾检测系统(Web 版)

本项目面向林区早期火情识别场景,使用YOLOv8完成火焰(Fire)与烟雾(Smoke)两类目标的检测模型训练,并以FastAPI构建 Web 检测平台,把模型能力封装为可直接登录使用的系统。平台除常规的图片、批量、视频、摄像头检测外,还提供同图多权重对比、数据集浏览与标注核对、模型热切换,以及把训练搬到网页上的能力:可在浏览器配置超参数发起真实训练,训练中在线调整学习率、查看进度与动态曲线,训练完成后下载产物或直接应用到检测。

Michael_Jay的博客 62

身份验证漏洞专题(三):持久登录、密码重置与密码修改中的凭据绑定缺陷

密码登录与双因素认证是身份验证的主干流程,但一个完整的认证体系还依赖三类辅助机制:持久登录("记住我")、密码重置、密码修改。这三类机制的共同特征是:它们同样携带或验证凭据,同样直接决定认证状态的归属,但实现时获得的防护强度往往远低于登录页面本身。攻击者绕不开登录接口时,常常可以从这些辅助入口进入。

2401_85321170的博客 629

二进制木马免杀-Python 分离免杀与 Web 挂马

二进制木马免杀-Python 分离免杀与 Web 挂马

2503_94637398的博客 268

Vue 前端开发 AI 对话页面:流式消息渲染、文件上传

关键点是不能手动设置 Content-Type 为 multipart/form-data,必须由浏览器自动生成带有 boundary 的请求头,否则后端无法解析。思路:将对象序列化为 JSON 字符串,作为 FormData 的一个普通字段(如 formData.append(‘payload’, JSON.stringify(data))),后端接收该字段后再反序列化。若上传大文件(>10MB),需实现独立的分片上传接口,在提交对话前先获取文件 id 或 url,再随文本发送引用。移除输入框的禁用态;

2402_85729970的博客 388

在Open-WebUI中提升向量化速度

让Open-WebUI AI聊天的向量化过程不超过10秒,而不是默认的20+分钟……

xyzzklk的博客 573

Writeup 4 0xGame 2021 · command (WEB)

前端限制不可信:永远不要相信前端的任何限制(如disabled按钮、JS 验证等)。攻击者可以直接构造 HTTP 数据包绕过前端校验,所有的安全限制必须在后端实现。命令执行/注入(RCE):Web 应用如果直接调用系统命令且未对输入进行严格过滤,攻击者可以利用;||等符号拼接恶意命令。绕过技巧:在 CTF 中,如果遇到命令执行被过滤,常见的绕过方式包括:${IFS}$IFS$9等。。cat /fla?或cat /fl*。Linux 基础。

hengdonghui的博客 131

vue3 markdown编辑框与压缩包文件上传及预览

el-input v-model="form.author" placeholder="作者/组织" maxlength="50" clearable /><el-select v-model="form.category" placeholder="请选择标签" class="full-width"><el-select v-model="form.license" placeholder="请选择" class="full-width">'编辑技能' : '新建技能' }}</div>

每一篇博客都是对自己技术的沉淀 174

使用HTML+CSS+JavaScript实现文件上传弹窗

使用HTML+CSS+JavaScript实现文件上传弹窗

bjzhang75的博客 203

热工测点布线改造难题?IDCB 远程 I/O 采集前端简化现场布线

IDCB智能数据采集前端基于Modbus-RTU协议,支持热电偶、热电阻、直流信号多类型混采,单设备多通道接入,减少模块选型压力。双总线冗余设计保障数据连续性,适配锅炉、窑炉等高可靠性工况。采用总线式布线替代点对点接线,大幅减少电缆用量,配合组态软件或LCD面板,实现远程监控与现场调试便捷化。适用于脱硫脱硝、就地监控及系统改造项目,具备抗干扰、隔离保护、掉电存参等特性,有效提升热工测点采集系统的稳定性与运维效率。

wxyzzdh200988的博客 192
上一篇: 前端转 AI 100 天 Day 3:函数、参数、作用域,*args 和 kwargs 给我上了一课
下一篇: 前端转 AI 100 天 Day 5:文件读写与异常处理,程序的“记忆“和“保险“
Dmz丶
博客等级 码龄7年 32粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值