Cor*_*rey 51 python oop finalizer python-3.x
这段代码......
class Person:
num_of_people = 0
def __init__(self, name):
self.name = name
Person.num_of_people += 1
def __del__(self):
Person.num_of_people -= 1
def __str__(self):
return 'Hello, my name is ' + self.name
cb = Person('Corey')
kb = Person('Katie')
v = Person('Val')
Run Code Online (Sandbox Code Playgroud)
产生以下错误......
Exception AttributeError: "'NoneType' object has no attribute 'num_of_people'" in <bound method Person.__del__ of <__main__.Person object at 0x7f5593632590>> ignored
Run Code Online (Sandbox Code Playgroud)
但是这段代码没有.
class Person:
num_of_people = 0
def __init__(self, name):
self.name = name
Person.num_of_people += 1
def __del__(self):
Person.num_of_people -= 1
def __str__(self):
return 'Hello, my name is ' + self.name
cb = Person('Corey')
kb = Person('Katie')
vb = Person('Val')
Run Code Online (Sandbox Code Playgroud)
我看到的唯一区别是最后一个变量名称是"vb"与"v".
我正在学习Python并正在研究OOP的东西.
Mar*_*ers 59
是的,虽然它不是导致这个的变量名称,而不是直接.
当Python退出时,所有模块也会被删除.清理模块的方法是将模块中的所有全局变量设置为None(因此这些引用不再引用原始对象).这些全局变量是字典对象中的键,并且由于字典是任意排序的,因此重命名一个变量可以更改变量清除的顺序.
当您重命名v到vb,你改变了哪些变量被清除,现在的顺序Person是最后的清除.
一种解决方法是type(self).num_of_people -= 1在__del__方法中使用:
def __del__(self):
type(self).num_of_people -= 1
Run Code Online (Sandbox Code Playgroud)
因为实例将始终具有对类的引用,或者测试if Person是否设置为None:
def __del__(self):
if Person is not None:
Person.num_of_people -= 1
Run Code Online (Sandbox Code Playgroud)
两个笔记:
CPython 3.3自动将随机哈希盐str应用于globals字典中使用的键; 这使得您观察到的行为更加随机,只是多次重新运行代码可能会或可能不会触发错误消息.
| 归档时间: |
|
| 查看次数: |
1036 次 |
| 最近记录: |