__repr__

1.触发时机:在使用repr转换对象的时候自动触发

2.作用:可以设置repr函数操作对象的结果

3.参数:一个self接受有当前对象本身

4.返回值:有必须是字符串

5.注意事项:正常情况下,类中的__str__和__repr__魔术方法是完全一样的(字符串中的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
28
29
30
31
32
33
34
35
36
37
38
39
40
class Human:
#成员属性
color = '红色'
age = 18
name = '梅花'

#成员方法
#__repr__魔术方法 在通常的类中 repr重载相当于 str也被重载
def __repr__(self):
print('repr方法被触发')
return 'repr返回的数据'
#所有类默认都存在一个等式
#__str__ = __repr__ 将repr的方法赋值给str方法 完全一样
#重新定义str魔术方法
def __str__(self):
return 'str返回的数据'

def eat(self):
print('海鲜真好吃~')
def drink(self):
print('啤酒很好喝')

#实例化对象
jh = Human()
#打印对象
print(jh)
#使用repr转换之后进行打印
print(repr(jh))

#repr的应用
mysong = '你\n吃饭\t了吗'
#正常打印字符串(打印字符串对象)
print(mysong)
print(str(mysong))
#使用repr函数转换并且打印
print(repr(mysong)) #字符串的str与repr结果不同

mylist = [1,2,3,3,54,5,5]
print(str(mylist))
print(repr(mylist))

__bool__

1.触发时机:使用bool() 转换对象的时候自动触发

2.作用: 用于检测对象成员的信息

3.参数:一个self接受当前对象

4.返回值:必须有且必须是布尔值

5.注意事项:无

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
class Man:
#属性
color = '红色'
age = 18
xb = '男'
married = '未婚'

#方法
#添加一个魔术方法
def __bool__(self):
print('bool方法被触发')
#判断 根据某些数据返回不同的布尔值 ,实现布尔转换对象的作用
if self.married == '已婚':
return True
else:
return False

def smoking(self):
print('多数男人会抽烟')
def say(self):
print('男人就会打游戏')

#实例化对象
mr = Man()
print(mr)
#转换对象 用于检测男人对象是否已婚
result = bool(mr)#一般情况下 对象转换的结果默认就是True
print(result)

__format__

1.触发时机:使用字符串.format()格式化字符串的时候自动触发

2.作用:自定义字符串的输出格式

3.参数:一个self接受当前对象,一个arg接受限定符号的字符串

4.返回值:有必须是字符串

5.注意事项:无

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
class Girl:
#成员属性
name = '熊初墨'
xb = '女'
age = 18

#成员方法
def __format__(self,arg):#arg 接受的是限定符号的字符串
#print('format方法被触发')
#print('arg的内容是',arg)
#return self.name

#实现format自带的对其和填充功能
#1.接受限定符号
flag = arg
#2.拆分限定符号
fillchar = flag[0]#填充字符
align = flag[1]#对其方式
length = int(flag[2:])#字符长度
#3.根据不同的符号进行不同的填充操作
#判断对其方式
if align == '>':#右对齐
newname = self.name.rjust(length,fillchar)
return newname
elif align == '^':#居中对其
newname = self.name.center(length,fillchar)
return newname
elif align == '<':#左对齐
newname = self.name.ljust(length,fillchar)
return newname
else:
return ''

def shopping(self):
print('买买买~~')
def eat(self):
print('吃烧烤~')

#实例化一个对象
xcm = Girl()
print(xcm)

#使用format来操作我们的对象
action = '我和我的闺蜜{:$<30}去逛街'
result = action.format(xcm)
print(result)

属性相关的魔术方法

就是获取成员,删除成员,修改成员相关联的魔术方法而已.

5个与属性相关的魔术方法:

1.__getattr__

2.__setattr__

3.__delattr__

4.__getattribute__

5.__dir__

属性访问的顺序:

1.调用__getattribute__

2.【调用数据描述符】

3.调用当前对象的所属成员

4.调用类的所属成员

5.【调用非数据描述符】

6.调用父类的所属成员

7.调用__getattr__

注意:以上步骤是调用某个成员的访问顺序及优先级。前面的能获取成员,就不会向后查找

__getattribute__

触发时机:访问对象成员的时候就会触发,无论成员是否存在

作用:可以在用户获取数据的时候进行数据处理等操作

参数:一个self接受当前对象,另外一个参数接受访问对象成员名称的字符串

返回值:有 不设定返回None

注意事项:在当前魔术方法中禁止使用当前对象.成员的方式访问成员,会触发递归操作,必须借助object的__getattribute__来获取当前对象的成员

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
class Human:
#添加成员属性(加入对象)
def __init__(self):
self.name = '东方雪'
self.xb = '男'
self.age = 18

#添加成员方法
#添加魔术方法__getattribute__
def __getattribute__(self, item):#item接受的是访问成员的名称字符串
#print(item)
#print('getattribute被触发')
#一定不能使用当前对象的成员访问,会再次触发当前魔术方法进入递归循环!
result = object.__getattribute__(self,item)
#隐藏用户名(你的操作)
newname = result[0] + '*' + result[-1]
#返回数据
return newname

def eat(self):
print('吃烧烤')
def drink(self):
print('喝啤酒')

#实例化对象
ls = Human()
print(ls)
#访问对象的名称
print(ls.xb)

'''
叫号显示:
张三 -> 张*三
李大嘴 -> 李*嘴
'''