You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何获取方法所属类名?解决装饰器耗时日志类名显示问题

Python装饰器获取方法所属类名以记录执行耗时

问题背景

需要实现一个装饰器记录Python方法的执行耗时,期望日志格式为类名.方法名 costs time: X.XXs,但当前装饰器仅能输出方法名(如__init__ costs time: 3.65s),无法获取方法所属的类名。

当前代码示例:

import functools
import time


def log_time(func):
    @functools.wraps(func)
    def record(*args, **kwargs):
        func_name = func.__name__
        start_time = time.time()
        result = func(*args, **kwargs)
        print(f"{func_name} costs time: {time.time() - start_time:.2f}s")
        return result

    return record


class FakeProject:
    @log_time
    def __init__(self, value):
        self.load_data = [i for i in range(value)]

fake_project = FakeProject(100000000)

尝试过程中打印func相关属性,发现func是普通函数类型,直接无法获取类关联信息:

<function FakeProject.__init__ at 0x0000022F3F365318>
__init__
<class 'function'>
function

解决方案

问题核心在于:装饰器定义时,方法还未绑定到类实例,所以func本身没有类信息。但当实例方法被调用时,第一个参数args[0]就是类的实例(即self),通过实例的__class__.__name__就能拿到类名。

修改后的装饰器代码如下:

import functools
import time


def log_time(func):
    @functools.wraps(func)
    def record(*args, **kwargs):
        func_name = func.__name__
        class_name = ""
        # 判断是否为实例方法(第一个参数是类实例)
        if args and hasattr(args[0], "__class__"):
            class_name = args[0].__class__.__name__ + "."
        
        start_time = time.time()
        result = func(*args, **kwargs)
        print(f"{class_name}{func_name} costs time: {time.time() - start_time:.2f}s")
        return result

    return record


class FakeProject:
    @log_time
    def __init__(self, value):
        self.load_data = [i for i in range(value)]
    
    @log_time
    def process_data(self):
        time.sleep(0.5)

fake_project = FakeProject(100000000)
fake_project.process_data()

输出效果

FakeProject.__init__ costs time: 3.65s
FakeProject.process_data costs time: 0.50s

补充说明

  • 对于类方法:第一个参数是类本身(即cls),此时args[0].__name__直接就是类名,可调整判断逻辑适配。
  • 对于静态方法:没有self或cls参数,这种情况无法直接获取类名,若需要支持,可考虑使用类装饰器或其他方式提前绑定类信息。

内容的提问来源于stack exchange,提问作者GSZ1006

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 18:50:32