类和对象-Ⅷ
>>> # __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
'小甲鱼' {:7_146:}
页:
[1]