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
相关产品推荐
相关产品推荐

