0%

new、del、str和repr魔术方法

1.__new__魔术方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# -*- coding:utf-8 -*-
# @Time :2022/6/21 9:42
# @SOFTWARE :python基础


# __new__魔术方法

"""
触发时机:实例化类生成对象的时候触发(触发时机在__init__之前)
功能:控制对象的创建过程
参数:至少一个cls接受当前的类,其他根据情况决定
返回值:通常返回对象或者None

"""
# (1)基本使用
class Myclass2():
a = 100

obj2 = Myclass2()
class MyClass1():
def __new__(cls):
# 类.成员方法(类)
# 返回本类对象
return object.__new__(cls)
# 返回其他类对象
# return obj2
# 不返回对象
# return None

obj = MyClass1()
print(obj)



# (2)__new__触发时机快于__init__
"""
先有对象,才能初始化对象
__new__ 创建对象
__init__ 初始化对象
"""

class Myclass():
def __init__(self):
print(2)

def __new__(cls):
print(1)
return object.__new__(cls)

obj = Myclass()

# (3)__new__的参数要和__init__参数一一对应
class Boat():
def __new__(cls, name):
return object.__new__(cls)
def __init__(self,name):
self.name = name

obj = Boat("山东舰")
print(obj.name)

# 使用手机参数进行改造
class Boat():
def __new__(cls, *args, **kwargs):
return object.__new__(cls)
def __init__(self,name,type):
self.name = name
self.type = type

obj = Boat("山东舰","304不锈钢")
print(obj.name,obj.type)

# (4) __new__和__init__之间的注意点
"""
如果__new__没有返回对象或者返回的是其他类的对象,不会调用构造方法
只有在返回自己本类对象的时候,才会调用构造方法
"""
class Children():
def __new__(cls, *args, **kwargs):
return object.__new__(cls)
# pass 没有返回对象,默认是None,无法在None关键字身上加name,skin成员属性
def __init__(self,name,skin):
self.name = name
self.skin - skin

2.__del__魔术方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# -*- coding:utf-8 -*-
# @Time :2022/6/22 9:20
# @SOFTWARE :python基础


# __del__魔术方法(析构方法)
"""
触发时机:当对象被内存回收的时候自动触发,(1.页面执行完毕回收所有变量,2.所有对象被del的时候)
功能:对象使用完毕后资源回收
参数:一个self接受对象
返回值:无

"""

# (1)基本语法
class Lion():
def __init__(self,name):
self.name = name
def __del__(self):
print("析构方法被触发...")

# 触发方式一:页面执行完毕回收所有变量
obj = Lion("辛巴")

# 触发方式二:所有对象被del的时候(引用计数为0时,才会删掉对象)

print("========start===========")
del obj
print("=======end==========")

# (2)模拟文件操作
import os
class ReadFile():
# 根据文件是否存在,创建对象
def __new__(cls,filename):
if os.path.exists(filename):
return object.__new__(cls)
else:
print("抱歉,没有这个文件")
# 打开文件
def __init__(self,filename):
self.fp = open(filename,mode="r",encoding="utf-8")
# 关闭文件
def __del__(self):
self.fp.close()
# 读取文件
def readcontent(self):
self.fp.read()

obj = ReadFile("多态.py")
print(obj.readcontent())

3.__str__和__repr__魔术方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# -*- coding:utf-8 -*-
# @Time :2022/6/22 9:44
# @SOFTWARE :python基础

# __str__魔术方法
"""
触发时机:使用print(对象)或者str(对象)的时候触发
功能:查看对象
参数:一个self接受当前对象
返回值:必须返回字符串类型

"""

# __repr__魔术方法
"""
触发时机:使用repr(对象)的时候触发
功能:查看对象
参数:一个self接受当前对象
返回值:必须返回字符串类型
"""


# 系统底层默认把__repr__方法赋值给__str__方法,索引通过print()或者str强转可以触发
# __str__ = __repr__



  • 本文作者: 灰羊
  • 本文链接: http://hyqq.xyz/post/472.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!