【问题标题】:Use class instance names as legend entry for e.g. a plot使用类实例名称作为图例条目,例如剧情
【发布时间】:2022-07-20 23:59:20
【问题描述】:

假设我已经定义了一个类并创建了几个实例:

A = MyClass()
B = MyClass()

现在假设我定义了一个my_plot 函数,该函数将MyClass 类的实例作为输入,例如我有类似以下内容:

def my_plot(X,Y):
    # Do something and plot
    plt.legend([?,??])

我可以用my_plot(A,B) 打电话。

我希望将上面伪代码sn-p的plt.legend([?,??])行中的???分别替换为AB。 到目前为止,解决问题的一种方法是为MyClass 配备属性name 并执行类似的操作

A = MyClass('nameA')
B = MyClass('nameB')

然后

def my_plot(X,Y):
    # Do something
    plt.legend([X.name,Y.name])

但我发现用A = MyClass('nameA'), B = MyClass('nameB') 实例化一个类很无聊。我希望用A = MyClass(), B = MyClass() 实例化我的类,并在my_plot 函数中检索绘图的实例名称。

【问题讨论】:

  • 你应该阅读例如nedbatchelder.com/text/names.html - 名称是标签,分配给它们的标识符(无论是无、一个或多个)不是实例的属性。也许使用字典,那么您可以使用键(名称)和值(实例)?
  • d = {'A': MyClass(), 'B': MyClass()}。现在d['A']d['B'] 是您的参考,而不是AB。更重要的是,名称现在是数据,而不是代码,并且可以传递给my_plot

标签: python


【解决方案1】:

如果您将变量名称作为参数传递给绘图,那么您可以使用 f-strings:

>>> myvar = object()
>>> myvar2 = 6
>>> print(f"{myvar=} {myvar2=}")
myvar=<object object at 0x7f32b650c850> myvar2=6

所以你可以在等号处拆分并保留变量名:

>>> myvar = object()
>>> print(f"{myvar=}".split('=')[0])
myvar

然后,无论您是打印它还是将其发送到另一个函数,您都可以按照您想要的方式使用它。

来自this comment

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 2014-05-25
    • 2019-07-08
    相关资源
    最近更新 更多