BrightXiong 发表于 2023-3-25 19:04:42

类和对象-Ⅷ

>>> # __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
'小甲鱼'

match123_xbd 发表于 2023-3-29 08:20:29

{:7_146:}
页: [1]
查看完整版本: 类和对象-Ⅷ