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)
之类的内容,但是当他们不工作时我并不感到惊讶。
有办法做到这一点吗?有没有更好的方法来理解可以帮助我自己回答的类实例?
答案 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
引用,这为解释器提供了不垃圾的理由 - 收集它。只有当没有引用它们时,对象才会以这种方式消失。 (不包括弱引用,但那是另一个故事。)
但是,解释器不会为您的自定义对象创建任何自己的引用。所以没有办法访问一个对象,除非通过一些变量或你存储它的东西。