| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
>>> # __init__() 是对象构建的时候调用的魔法方法,其实参与构建对象还有一个 __new__() 方法,它是在 __init__() 之前被调用的。 
>>> # 对象的诞生流程,是先调用 __new__() 方法,创建一个类的实例,然后将其传递给 __init__() 方法进行个性化定制,这么一个流程 
>>> # 需要重写 __new__() 方法的情况极少,通常会用到它不外乎两种情况: 
>>> # 一种情况是在元类中去定制类,元类是 Python 中最难理解的概念之一,是称之为魔法方法背后的魔法方法 
>>> # 另一种情况比较特殊,是在继承不可变数据类型的时候,如果我们想要 “从中作梗”,就可以通过重写 __new__() 魔法方法进行拦截 
>>> class CapStr(str): 
...         def __new__(cls, string): 
...                 string = string.upper() 
...                 return super().__new__(cls, string) 
...  
>>> cs = CapStr("FishC") 
>>> cs  
'FISHC' 
 
>>> # 相反,__del__() 魔法方法是在对象即将被销毁的时候所自动调用的。 
>>> class C: 
...         def __init__(self): 
...                 print("我来了~~") 
...         def __del__(self): 
...                 print("我走了~~") 
...  
>>> c = C() 
我来了~~ 
>>> del c  
我走了~~ 
 
>>> #  对象重生之旅 
>>> class D: 
...         def _init__(self, name): 
...                 self.name = name 
...         def __del__(self): 
...                 global x  
...                 x = self 
...  
>>> d = D() 
>>> d  
<__main__.D object at 0x0136E040> 
>>> d.name = "Jerk" 
>>> d.name  
'Jerk' 
>>> del d   
>>> d  
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
NameError: name 'd' is not defined 
 
>>> x  
<__main__.D object at 0x0136E040> 
>>> x.name  
'Jerk' 
 
>>> # 还有一种方法是通过闭包的形式,将这个对象给保存起来。 
>>> class E: 
...         def __init__(self, name, func): 
...                 self.name = name  
...                 self.func = func 
...         def __del__(self): 
...                 self.func(self) 
...  
>>> def outer(): 
...         x = 0 
...         def inner(y=None): 
...                 nonlocal x  
...                 if y: 
...                         x = y   
...                 else: 
...                         return x  
...         return inner 
...  
>>> f = outer() 
>>> e = E("小甲鱼", f) 
>>> e  
<__main__.E object at 0x0136E460> 
>>> e.name  
'小甲鱼' 
>>> del e   
>>> e  
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
NameError: name 'e' is not defined 
>>> g = f() 
>>> g  
<__main__.E object at 0x0136E460> 
>>> g.name  
'小甲鱼' |   
 
评分
- 
查看全部评分
 
 
 
 
 
 |