Appearance
Python 类与模块速查:类的定义、属性/方法、继承、常用魔法方法(dunder)、装饰器、模块与包的导入方式,以及高频内置函数。看完即可上手写类和复用代码。
类速查
python
# === 定义类 ===
class Dog:
species = "Canis" # 类属性(所有实例共享)
def __init__(self, name, age): # 构造方法
self.name = name # 实例属性
self.age = age
def bark(self): # 实例方法(第一个参数 self)
return f"{self.name}: 汪!"
@classmethod
def from_dict(cls, d): # 类方法:可用 cls 建实例
return cls(d["name"], d["age"])
@staticmethod
def info(): # 静态方法:不依赖实例/类
return "狗狗"
# === 使用 ===
d = Dog("旺财", 3)
d.bark() # 调用实例方法
Dog.from_dict({"name": "小黄", "age": 1}) # 类方法继承速查
python
class Puppy(Dog): # 继承 Dog
def __init__(self, name):
super().__init__(name, 0) # 调父类构造
def bark(self): # 方法重写
return super().bark() + "(奶声奶气)"
isinstance(d, Dog) # True 实例类型检查
issubclass(Puppy, Dog) # True魔法方法(dunder)速查表
| 方法 | 触发时机 | 用途示例 |
|---|---|---|
__init__(self, ...) | 创建实例 | 初始化属性 |
__str__ | str(obj) / print | 人类可读描述 |
__repr__ | 交互环境 / repr(obj) | 开发者可读(优先实现它) |
__len__ | len(obj) | 让对象支持 len() |
__getitem__ | obj[key] | 让对象支持下标访问 |
__iter__ / __next__ | for x in obj | 让对象可迭代 |
__eq__ / __lt__ 等 | == / < | 自定义比较 |
__call__ | obj() | 让实例可像函数调用 |
__enter__ / __exit__ | with obj: | 上下文管理器 |
__contains__ | x in obj | 成员判断 |
python
class Book:
def __init__(self, pages): self.pages = pages
def __len__(self): return len(self.pages)
def __getitem__(self, i): return self.pages[i]
def __str__(self): return f"Book({len(self)}页)"
b = Book([1,2,3]); len(b) # 3;b[0] → 1;print(b)装饰器速查
python
# 最简单的装饰器:给函数加功能
def log(func):
def wrapper(*args, **kwargs):
print(f"调用 {func.__name__}")
return func(*args, **kwargs)
return wrapper
@log # 等价 greet = log(greet)
def greet(name): return f"hi {name}"
# 常用内置装饰器
@staticmethod # 静态方法(不传 self/cls)
@classmethod # 类方法(传 cls)
@property # 把方法变属性:obj.age 而非 obj.age()模块与包速查
python
import math # import math; math.sqrt(4)
from math import sqrt, pi # 直接 sqrt(4)
import numpy as np # 别名(生态惯例)
from . import sibling # 包内相对导入
# 模块内常用保护:
if __name__ == "__main__": # 仅直接运行时执行(被导入时不执行)
main()
# 重新加载 / 查看
import importlib; importlib.reload(mod)高频内置函数补遗
python
dir(obj) # 列出对象所有属性/方法
help(obj) # 查看文档
getattr(obj, "name", 默认) # 安全取属性
hasattr(obj, "name") # 判断有无属性
vars(obj) # 实例 __dict__
globals() / locals()
id(x) # 对象身份
callable(f) # 是否可调用常见坑
- 可变类属性共享:
species = []放类体里所有实例共享——要每实例独立就在__init__里建 - 少用
__del__做清理:时机不可靠;资源清理用with/上下文管理器 @property别写重活:属性访问语义=轻量,计算昂贵就用方法from module import *污染命名空间:用显式导入或__all__限定- 循环导入:两个模块互相 import 会报错——把公共部分拆到第三个模块
一句话总结
类 = __init__ 建实例属性 + 继承用 super();想让对象支持 len()/下标/print 就去实现 __len__/__getitem__/__str__,装饰器本质是 greet = log(greet),循环导入就把公共部分拆到第三个模块。