我可以打印出类的实例名吗?

2024-06-28 06:56:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在打印一个类的实例名。 在本例中,它是一个计时器,可以打印出代码中各个重叠部分的运行时间:

class timerstart:
    def __init__(self):
        # Sets some variables with system time

    def stop(self):
        # Calculates current total time
        print(*instance name*, 'total time is ...')

因此,当我在代码中调用它时,它看起来像:

allcode=timerstart()
  # some code
    subcode=timerstart()
      # some code
    subcode.stop()
  # some code
allcode.stop()

输出:

subcode total time...
allcode total time...

我知道我可以用它的名字来初始化函数:allcode=timerstart(name='allcode') 真烦人。你知道吗

我还遇到了使用inspect.currentframe().f_back.f_locals.items()进行回溯的问题

有没有打印实例名的方法,比如print(self.selfname)之类的?你知道吗


Tags: 实例代码nameselftimedefcodesome
2条回答

使timerstart成为context manager。那么您根本不需要对timer对象的引用。你知道吗

import time


class timer:
    def __init__(self, name):
        self.name = name

    def __enter__(self):
        self.start = time.time()

    def __exit__(self, *args):
        print(f'{self.name} total time {time.time() - self.start}')

然后使用with语句编写代码:

with timer("allcode"):
    # some code
    with timer("subcode"):
        # some sub-block
    # some more code

您可以使用contextlib.contextmanager定义管理器,而不是在类上显式定义__enter____exit__方法。你知道吗

import contextlib


@contextlib.contextmanager
def timer(name):
    start = time.time()
    yield
    print(f'{name} total time {time.time() - start}')

简单的回答是:不能总是工作。Python变量名是指向该对象的单向映射。同一个实例可能有多个名称,这意味着多个变量引用同一个实例。一个简单的例子是:

obj1 = [1,2,3]
obj2 = obj1
# Demonstration that the object is now obj2 and obj1 at the same time
obj2[0] = 0
obj1 = [0,2,3]

这里,由obj1实例化的对象也被命名为obj2。打印或获取此类的实例名称现在是不明确的。你知道吗

获取对象allcodesubcode的名称的最佳方法是分配一个名称字段,并像以前一样实例化它,或者修改构造函数以便必须为其分配一个名称。你知道吗

相关问题 更多 >