是否可以在不使用存储的变量的情况下引用类实例?

时间:2016-05-03 13:39:01

标签: python class python-3.x variables

class Dog:
  def __init__(self, ap1)
    self.name = ap1
    self.tricks = []
  def.addTrick(self, ap1)
    self.tricks.append(ap1)

所以上面我有一个课程意在产生狗的实例。

curDog=Dog("Seymour")
curDog.addTrick("Wait Forever")
print("curDog is " + curDog.name)
print(curDog.name + " knows " + str(curDog.tricks))
print("")

curDog=Dog("Brian")
curDog.addTrick("Psuedo Intellectual Debate")
print("curDog is " + curDog.name)
print(curDog.name + " knows " + str(curDog.tricks))
print("")

上面我有两个实例,Dog('Seymour')Dog('Brian'),连续占据相同的变量curDog(当前的狗)。输出如下:

>>> main()
curDog is Seymour
Seymour knows ['Wait Forever']

curDog is Brian
Brian knows ['Pseudo Intellectual Debate']

>>>

显然我意识到,一旦curDog用于存储Brian,它将不再引用Seymour。但在这一点上,我想知道Seymour发生了什么。他是否仍然在环境以太,只是从变量链接断开?或者他完全被歼灭为布莱恩腾出空间?

如果是前者,我怎样才能访问他和他的技巧列表?

更多帖子的原始点,是否可以在不使用curDog的情况下引用Brian?我尝过了print("Brian".tricks)print(Dog('Brian').tricks)之类的内容,但是当他们不工作时我并不感到惊讶。

有办法做到这一点吗?有没有更好的方法来理解可以帮助我自己回答的类实例?

1 个答案:

答案 0 :(得分:1)

您可以通过添加一些代码来解决这个问题,以便在Seymour收集垃圾时告诉您。

class Dog:
  # ...
  def __del__(self):
    print('*** deleting {} ***'.format(self.name))

使用此添加运行代码可以准确显示发生的情况:

curDog is Seymour
Seymour knows ['Wait Forever']

*** deleting Seymour ***
curDog is Brian
Brian knows ['Psuedo Intellectual Debate']

*** deleting Brian ***

值得注意的是,无法保证程序必须以这种方式运行。 Python解释器可以选择等待稍后删除Seymour - 可能是在程序结束时,或者当它需要内存时,等等。因此,不要编写依赖于立即对垃圾进行收集的对象的Python程序。但实际上,等待没有任何优势,因此解释器会在不再引用对象时立即删除它们。

当然,可以对对象进行多次引用 - 也就是说,同一对象可以存储在多个变量中。您可以创建一个新变量curDog2并将Seymour存储在其中,然后当您将curDog重新分配给Brian时,Seymour仍然会被curDog2引用,这为解释器提供了不垃圾的理由 - 收集它。只有当没有引用它们时,对象才会以这种方式消失。 (不包括弱引用,但那是另一个故事。)

但是,解释器不会为您的自定义对象创建任何自己的引用。所以没有办法访问一个对象,除非通过一些变量或你存储它的东西。