有没有办法让 class 对象通过持有它的变量名来代表自己?
Is there a way to make a class object represent itself by the variable name holding it?
我有以下代码,其中 info
参数可以是任何东西(str、int、list 等):
class MyClass():
def __init__(self, info):
self.info = info
object_1 = MyClass("Whatever 1")
object_2 = MyClass("Whatever 2")
object_3 = MyClass("Whatever 3")
my_list = [object_1, object_2, object_3]
print(my_list)
如果你运行它,你会得到以下结果:
[<MyClass object at 0x7f**********>, <MyClass object at 0x7f**********>, <MyClass object at 0x7f**********>]
但我想print(my_list)
打印这个:
[object_1, object_2, object_3]
有没有办法做到这一点,而不向 __init__
函数定义(例如 def __init__(self, info, representation):
)添加另一个参数并定义返回其值的 __repr__
(例如 return representation
)?
如果您对同一个变量有多个引用,这将变得非常难以使用。您最好的选择是拥有某种注册表 class 来跟踪 class 的所有哈希值并仅引用注册表对象,可能包含一个 __iter__
方法。
我真的不建议这样做,而且我不确定如何让它在面对各种复杂情况时变得健壮,例如 class 和不同模块中的变量,或者对实例有多个绑定。
然而,出于各种注意事项,为了好玩,这里有一个概念验证,它假设 class 及其实例绑定在同一个模块中
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]
我有以下代码,其中 info
参数可以是任何东西(str、int、list 等):
class MyClass():
def __init__(self, info):
self.info = info
object_1 = MyClass("Whatever 1")
object_2 = MyClass("Whatever 2")
object_3 = MyClass("Whatever 3")
my_list = [object_1, object_2, object_3]
print(my_list)
如果你运行它,你会得到以下结果:
[<MyClass object at 0x7f**********>, <MyClass object at 0x7f**********>, <MyClass object at 0x7f**********>]
但我想print(my_list)
打印这个:
[object_1, object_2, object_3]
有没有办法做到这一点,而不向 __init__
函数定义(例如 def __init__(self, info, representation):
)添加另一个参数并定义返回其值的 __repr__
(例如 return representation
)?
如果您对同一个变量有多个引用,这将变得非常难以使用。您最好的选择是拥有某种注册表 class 来跟踪 class 的所有哈希值并仅引用注册表对象,可能包含一个 __iter__
方法。
我真的不建议这样做,而且我不确定如何让它在面对各种复杂情况时变得健壮,例如 class 和不同模块中的变量,或者对实例有多个绑定。
然而,出于各种注意事项,为了好玩,这里有一个概念验证,它假设 class 及其实例绑定在同一个模块中
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]