Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Functools -- partialmethod

✅ 1. partialmethod 是什么?

partialmethod 专门用于 类中的方法,它用于:

预先绑定方法的一部分参数,生成一个新的 class method。

类似于 partial(偏函数),但:

partial 用于函数

partialmethod 用于类的方法

🟦 2. 最简单示例(立即理解)

from functools import partialmethod

class Logger:
    def log(self, level, msg):
        print(f"[{level}] {msg}")

    info = partialmethod(log, "INFO")
    error = partialmethod(log, "ERROR")

l = Logger()
l.info("启动完成")
l.error("出错了")

输出:

[INFO] 启动完成
[ERROR] 出错了

👉 info() 和 error() 实际上是 log() 绑定参数后的方法。

🟩 3. 为什么需要 partialmethod?

如果一个类中:

  • 某些方法参数几乎一样
  • 需要根据不同模式定制方法
  • 需要减少重复代码
  • 类内大量“模板方法”
  • 想优雅复用方法逻辑

partialmethod 能让代码更简洁。

🟧 4. 内部原理(重要)

partialmethod(func, *pre_args, **pre_kwargs) 会:

  1. 生成一个方法对象 (callable)
  2. 调用时自动把预设参数应用在 后面实际调用的方法中
  3. self 会被自动传入第一个参数

例如:

info = partialmethod(log, "INFO")

实际上相当于:

def info(self, msg):
    return self.log("INFO", msg)

🟦 5. 对比 partial & partialmethod

| 功能 | partial | partialmethod | | 用于普通函数 | ✅ | ❌ | | 用于类方法 | ⚠️ 可用但不优雅 | ✅ 专门设计 | | 自动绑定 self | ❌ 需要手动处理 | ✅ 自动绑定 self | | 语法可读性 | 一般 | 更清晰 | | 常用场景 | map / callbacks | 类中创建定制方法 |

partial + 类:

class A:
    m = partial(f, x)

⚠️ 这种方式 self 不会自动传入,会出错。

🟧 6. partialmethod 的实战场景

下面是最常见的工程用法:

场景 1:日志类(你可能在项目中直接用到)

class Log:
    def log(self, level, msg):
        print(f"[{level}] {msg}")

    info  = partialmethod(log, "INFO")
    debug = partialmethod(log, "DEBUG")
    error = partialmethod(log, "ERROR")

避免写重复代码:

log.error("数据库连接失败")

场景 2:状态机

class FSM:
    def transition(self, event, *args):
        print(f"转移状态: {event}, args={args}")

    start  = partialmethod(transition, "start")
    stop   = partialmethod(transition, "stop")
    reset  = partialmethod(transition, "reset")

场景 3:HTTP 客户端封装

class APIClient:
    def request(self, method, path, **kwargs):
        print(f"{method} {path}", kwargs)

    get  = partialmethod(request, "GET")
    post = partialmethod(request, "POST")
    put  = partialmethod(request, "PUT")

使用:

api = APIClient()
api.get("/users")
api.post("/users", json={"a": 1})

场景 4:SQL 操作类

class DB:
    def query(self, table, where=None):
        ...

    query_users = partialmethod(query, "users")
    query_logs  = partialmethod(query, "logs")

🟩 7. partialmethod 完整语法

partialmethod(func, /, *args, **kwargs)
  • args -> 固定位置参数
  • kwargs -> 固定关键字参数
  • self 在调用时自动注入

🟥 8. 深入示例:多参数绑定

class Calculator:
    def calc(self, x, y, op):
        if op == "+":
            return x + y
        else:
            return x - y

    add = partialmethod(calc, op="+")
    sub = partialmethod(calc, op="-")

c = Calculator()
print(c.add(1, 2))   # 3
print(c.sub(5, 3))   # 2

🟦 9. partialmethod 可以叠加使用

debug_info = partialmethod(Logger.info, "[DEBUG]")

🟪 10. 注意事项(非常关键)

❌ 不能用于 staticmethod / classmethod 上

例如:

class A:
    @staticmethod
    def f(x): pass

    g = partialmethod(f, 1)   # ❌ 不能这样用

partialmethod 需要“绑定 self”。

✅ 要绑定类方法,必须保持目标方法是实例方法。

🟩 11. 一屏速查表

from functools import partialmethod

class C:
    def func(self, x, y):
        ...

    f = partialmethod(func, 100)   # 等效于 func(self, 100, y)

用途:

  • 创建多个参数略有不同的方法
  • 日志系统
  • HTTP Client
  • 状态机
  • ORM 封装

优点:

  • 自动传 self
  • 可读性强
  • 代码复用率高