Skip to content

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)     # 是否可调用

常见坑

  1. 可变类属性共享species = [] 放类体里所有实例共享——要每实例独立就在 __init__ 里建
  2. 少用 __del__ 做清理:时机不可靠;资源清理用 with/上下文管理器
  3. @property 别写重活:属性访问语义=轻量,计算昂贵就用方法
  4. from module import * 污染命名空间:用显式导入或 __all__ 限定
  5. 循环导入:两个模块互相 import 会报错——把公共部分拆到第三个模块

一句话总结

类 = __init__ 建实例属性 + 继承用 super();想让对象支持 len()/下标/print 就去实现 __len__/__getitem__/__str__,装饰器本质是 greet = log(greet),循环导入就把公共部分拆到第三个模块。

相关概念