鱼C论坛

 找回密码
 立即注册
查看: 2005|回复: 1

[学习笔记] 类和对象-Ⅷ

[复制链接]
发表于 2023-3-25 19:04:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
歌者文明清理员 + 5 + 5 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-29 08:20:29 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 00:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表