【问题标题】:How to get the class name of a method in Python?如何在 Python 中获取方法的类名?
【发布时间】:2022-11-25 11:42:24
【问题描述】:

这是我的问题和代码: 我尝试使用装饰器来记录时间成本;但我无法获得班级名称。

import functools
import time


def log_time(func):
    @functools.wraps(func)
    def record(*args, **kwargs):
        # print(func)
        # print(func.__name__)
        # print(func.__class__)
        # print(func.__class__.__name__)
        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)

以上代码的日志消息为__init__ cost time: 3.65s

但我想要 FakeProject.__init__ cost time: 3.65s 代替。

我怎样才能得到类名并打印出来?任何人都可以帮忙吗?不管怎么说,还是要谢谢你

我尝试打印

print(func)
print(func.__name__)
print(func.__class__)
print(func.__class__.__name__)

我得到

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

【问题讨论】:

    标签: python class printing decorator


    【解决方案1】:

    在这种特殊情况下,您可以只使用__qualname__

    import functools
    import time
    
    
    def log_time(func):
        @functools.wraps(func)
        def record(*args, **kwargs):
            func_name = func.__qualname__
            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)
    

    这输出:

    FakeProject.__init__ costs time: 5.26s
    

    【讨论】:

    • 是的,你是对的,非常感谢
    猜你喜欢
    • 2012-12-15
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    相关资源
    最近更新 更多