【问题标题】:how can i refer to instance name in the class?我如何在类中引用实例名称?
【发布时间】:2018-06-06 09:10:14
【问题描述】:

在这段代码中:

class X:
    def __init__(self, y=None):
        self.y = y
        self.z = []
        try:
            y.z.append(self)
        except:
            pass

a = X()
b = X(a)
c = X(a)

print(a.z)

我想打印 [b, c] 但它打印出类似这样的内容

out: <__main__.x object at 0x01775E70>, <__main__.x object at 0x01775E90>]

我该如何解决?

【问题讨论】:

  • 请查看问题中的代码并修复缩进
  • 有什么要解决的?这就是python代表bc的方式。
  • 我想它发回给我正好 [b,c] 而不是他们的地址
  • bc 是对象(X 的实例),您希望 Python 如何知道您希望它们如何表示?如果您想要自定义表示,请阅读 __repr__()__str__() magic 方法。
  • 不要将代码用作数据。如果您希望您的对象具有.name 属性,则为它们提供.name 属性。

标签: python python-3.x class


【解决方案1】:

不可能*。名称是单向引用值。你不能从一个值变成一个名字。考虑引用相同值的许多名称,例如a = b = 1。值1true 名称是什么?没有,所有的名字都是一样的。

*不检查源代码。正如我所说,如果您随后分配c = ba.z 的显示方式会发生什么?您尝试做的事情是徒劳的,如果您真的需要它,您就会遇到设计问题。

【讨论】:

  • 吹毛求疵 - 并非不可能,但非常不切实际(而且大多没用)。可以通过检查前一帧以获取分配给它的名称来回溯分配 - 有点像 this 的简化版本,没有回溯分配。还是非常非常不推荐。
  • 我知道,但在这种情况下,我想要这些名字,我该怎么做?
  • @zwer 满意吗? :)
  • @papay 你不能以任何有意义的方式。
  • @timgeb - 非常?
【解决方案2】:

如果你想让print为一个对象显示一个文本,你需要实现__str__方法:

class X:
    def __init__(self, name, y=None):
        self.name = name
        self.y = y
        self.z = []
        try:
            y.z.append(self)
        except:
            pass

    def __repr__(self):
        return self.name


a = X("a")
b = X("b", a)
c = X("c", a)

print(a.z)

或者您是否希望 print 使用对象引用的名称?

【讨论】:

  • 这段代码还打印“[<__main__.x object at>, <__main__.x object at>]”
  • 修复它,list.__str__ 使用他们的 __repr__ 方法显示列表中的对象
猜你喜欢
  • 1970-01-01
  • 2023-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多