Python 有没有办法让一个类对象通过持有它的变量名来表示它自己?

Python 有没有办法让一个类对象通过持有它的变量名来表示它自己?,python,python-3.x,class,repr,Python,Python 3.x,Class,Repr,我有以下代码,其中info参数可以是任何东西(str、int、list等): 如果运行它,将得到以下结果: [<MyClass object at 0x7f**********>, <MyClass object at 0x7f**********>, <MyClass object at 0x7f**********>] 有没有一种方法可以做到这一点,而无需向\uuuuu init\uuuuu函数定义中添加另一个参数(例如def\uuuuuu init\u

我有以下代码,其中
info
参数可以是任何东西(str、int、list等):

如果运行它,将得到以下结果:

[<MyClass object at 0x7f**********>, <MyClass object at 0x7f**********>, <MyClass object at 0x7f**********>]

有没有一种方法可以做到这一点,而无需向
\uuuuu init\uuuuu
函数定义中添加另一个参数(例如
def\uuuuuu init\uuuuu(self,info,representation):
)并定义返回其值的
\uuu repr\uuu

如果您对同一变量有多个引用,则使用此选项将非常困难。最好的办法是使用某种注册表类来跟踪该类的所有哈希值,并只引用注册表对象,很可能包括一个
\uuuuu iter\uuuu
方法。

如果对同一个变量有多个引用,这将变得非常困难。最好的办法是使用某种注册表类来跟踪类的所有散列,并只引用注册表对象,很可能包含一个
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法,我不确定如何使它在面对各种复杂情况时保持健壮,例如类和变量位于不同的模块中,或者对实例有多个绑定

然而,为了好玩,这里有一个概念证明,它假设类及其实例绑定在同一个模块中

import sys

class Magic:

    def __repr__(self):
        module = sys.modules[self.__class__.__module__]
        for name, object_ in vars(module).items():
            if object_ is self:
                return name
        else:
            return '<name not found>'


apple  = Magic()
banana = Magic()
cherry = Magic()

fruit = [apple, banana, cherry]
print(fruit)

我真的不建议这样做,而且我不确定如何使它在面对各种复杂情况时保持健壮,例如类和变量位于不同的模块中,或者对实例有多个绑定

然而,为了好玩,这里有一个概念证明,它假设类及其实例绑定在同一个模块中

import sys

class Magic:

    def __repr__(self):
        module = sys.modules[self.__class__.__module__]
        for name, object_ in vars(module).items():
            if object_ is self:
                return name
        else:
            return '<name not found>'


apple  = Magic()
banana = Magic()
cherry = Magic()

fruit = [apple, banana, cherry]
print(fruit)

要将变量名显示为表示形式吗?!?如果同一个对象被两个不同的变量引用怎么办?只需使用“另一个参数到
\uuu init\uu
函数定义”。这很清楚,而且易于使用和维护。所有将变量名链接到实际Python对象的解决方案都是脆弱的,不易使用。@MSeifert这就是为什么我问“是否可以这样做”。当然,我最初可以向init添加另一个参数,但我也想知道是否可以执行我所要求的操作。是否希望将变量名显示为表示形式?!?如果同一个对象被两个不同的变量引用怎么办?只需使用“另一个参数到
\uuu init\uu
函数定义”。这很清楚,而且易于使用和维护。所有将变量名链接到实际Python对象的解决方案都是脆弱的,不易使用。@MSeifert这就是为什么我问“是否可以这样做”。当然,我最初可以在init中添加另一个参数,但我也想知道是否可以执行我所要求的操作。如果您想在当前模块之外创建它们,这会立即中断(您提到了这一点,但我想再次强调这一点)。事实上,我不建议尝试鼓励为不应该解决的问题找到解决方案(至少不是以问题要求的方式),即使这些问题很有趣。@MSeifert。。。这就是为什么我在开始回答时说我真的不建议这样做,并暗示它不会在不同的模块之间工作。@MSeifert:-)同意。只是想确定一下:哦,相信我们。你不想这样做!当我一想起你可以(做一件愚蠢的事)用不同的变量引用同一个对象时,我就意识到不可能轻易地完成我的要求。此外,我最初说“如果有办法的话”,这意味着这是一件更有趣的事情,而不是一个救命恩人。当你想在当前模块之外创建它们时,这一点就会中断(你提到了,但我想再次强调这一点)。事实上,我不建议尝试鼓励为不应该解决的问题找到解决方案(至少不是以问题要求的方式),即使这些问题很有趣。@MSeifert。。。这就是为什么我在开始回答时说我真的不建议这样做,并暗示它不会在不同的模块之间工作。@MSeifert:-)同意。只是想确定一下:哦,相信我们。你不想这样做!当我一想起你可以(做一件愚蠢的事)用不同的变量引用同一个对象时,我就意识到不可能轻易地完成我的要求。此外,我最初说“如果有办法做到这一点”,这意味着这是一件更有趣的事情,而不是一个救命恩人。
import sys

class Magic:

    def __repr__(self):
        module = sys.modules[self.__class__.__module__]
        for name, object_ in vars(module).items():
            if object_ is self:
                return name
        else:
            return '<name not found>'


apple  = Magic()
banana = Magic()
cherry = Magic()

fruit = [apple, banana, cherry]
print(fruit)
[apple, banana, cherry]