"""Python类变量与实例变量——属性查找链与可变对象陷阱
------------------------------------------------------------------------------
属性访问遵循 实例 -> 类 -> 父类 的查找链。类变量在实例间共享,
实例变量每个对象独有一份。理解边界是避免诡异 bug 的关键。
"""
from typing import List, Optional
# ========== 1. 属性查找链:实例变量遮蔽类变量 ==========
class Employee:
company: str = "Acme Corp" # 类变量共享
def __init__(self, name: str) -> None:
self.name = name # 实例变量独有
e1, e2 = Employee("Alice"), Employee("Bob")
print(e1.company) # Acme Corp(查找到类变量)
e1.company = "Startup" # 创建实例变量遮蔽类变量
print(e1.company) # Startup(实例变量)
print(e2.company) # Acme Corp(类变量不变)
del e1.company # 删除后恢复类变量可见
print(e1.company) # Acme Corp
# ========== 2. 可变类变量陷阱 ==========
class Group:
"""可变类变量(列表/字典)会在所有实例间共享!"""
students: List[str] = [] # 错误的共享设计
def __init__(self, name: str) -> None:
self.name = name
def add(self, name: str) -> None:
self.students.append(name)
g1, g2 = Group("一班"), Group("二班")
g1.add("小明"); g2.add("小红")
print(g1.students) # ['小明', '小红'] —— 互相干扰!
print(g2.students) # ['小明', '小红'] —— 同一引用
class SafeGroup:
"""正确:实例变量在 __init__ 中初始化"""
max_capacity = 50 # 不可变常量放类变量没问题
def __init__(self, name: str) -> None:
self.name = name
self.students: List[str] = [] # 每个实例独立列表
# ========== 3. @classmethod 访问类变量 ==========
class Config:
_cfg: dict = {"debug": False}
_count: int = 0
def __init__(self) -> None:
Config._count += 1
@classmethod
def get(cls, key: str) -> Optional[str]:
return cls._cfg.get(key)
@classmethod
def set(cls, key: str, val: str) -> None:
cls._cfg[key] = val
# ========== 4. __dict__ 检查 ==========
class Parent:
p_var = "parent"
shared: List[str] = []
class Child(Parent):
c_var = "child"
obj = Child(); obj.instance = "owned"
print(obj.__dict__) # {'instance': 'owned'}
print("c_var" in Child.__dict__) # True
print("p_var" in Child.__dict__) # False(继承,不在自身 __dict__)
# ========== 5. 继承与可变类变量共享 ==========
class Base:
label = "base"
items: List[str] = []
class A(Base): label = "A"
class B(Base): label = "B"
print(A.label, B.label) # A B(不可变独立)
A.items.append("来自A")
print(B.items) # ['来自A'] —— 基类列表共享!
Python类变量与实例变量
张小明
前端开发工程师
专业级LCU客户端集成工具:League Akari架构解析与实战指南
专业级LCU客户端集成工具:League Akari架构解析与实战指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari是一款基于…
InternLM2.5-20B-Chat:200亿参数中文对话大模型完全指南
InternLM2.5-20B-Chat:200亿参数中文对话大模型完全指南 【免费下载链接】internlm2_5-20b-chat 项目地址: https://ai.gitcode.com/hf_mirrors/AI-Research/internlm2_5-20b-chat 🚀 想要体验强大的中文对话AI模型吗? 今天为您详细介…
智能可调USB直流电源插座:DIY分布式储能与物联网供电方案
1. 项目概述:一个为分布式储能而生的智能电源插座在捣鼓家庭自动化和物联网项目的这些年里,我遇到最头疼的问题之一,就是如何优雅、高效地为那些散落在各个角落的低压直流设备供电。从给智能传感器、摄像头供电,到驱动一些小型的机…
5个实用技巧:使用HRNet-W18.ms_aug_in1k优化你的图像分类项目
5个实用技巧:使用HRNet-W18.ms_aug_in1k优化你的图像分类项目 【免费下载链接】hrnet_w18.ms_aug_in1k 项目地址: https://ai.gitcode.com/hf_mirrors/CICC/hrnet_w18.ms_aug_in1k HRNet-W18.ms_aug_in1k是一个基于高分辨率表示学习的图像分类模型ÿ…
开源DIY合成器制作指南:从电路原理到焊接调试全流程
1. 项目概述:亲手打造你的第一台桌面合成器如果你和我一样,对电子音乐着迷,同时又是个喜欢动手鼓捣硬件的“拆家”爱好者,那么自己动手做一台合成器,绝对是件能让你兴奋好几个月的事。市面上动辄数千元的模拟合成器&am…
DIY纸板蓝牙音箱:从零打造低成本音频系统
1. 项目概述与设计思路作为一个常年泡在工作室里折腾各种电子废料和日常材料的DIY爱好者,我始终对“变废为宝”这件事抱有极大的热情。这次分享的项目,就是用最常见的快递纸箱,打造一个完全可用的蓝牙音箱。这不仅仅是为了省钱,更…