__getattr__

触发时机:访问不存在的对象成员的时候自动触发

作用:防止访问不存在成员的时候报错!为不存在的成员定义值

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

返回值:可有可无

注意事项:无

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

#添加成员方法
#魔术方法
def __getattr__(self,item):
#print('getattr方法被触发')
#print(item)
#检测用于访问与name相关的信息都返回名称 (name)
if 'name' in item:
return self.name

def eat(self):
print('一天三顿小烧烤~')
def drink(self):
print('喝啤酒~')

#实例化对象
df = Human()
print(df)
#访问对象成员
print(df.name2)

__setattr__

触发时机:添加对象成员或者修改对象成员的时候自动触发!

作用:可以限制或者管理对象成员的添加与修改操作

参数:一个self接受当前对象 第二个接受设置的成员名称字符串 第三个设置的值

返回值:无

注意事项:在当前魔术方法中禁止使用当前对象.成员名 = 值的方式,会触发递归cao’zuo!

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

# 添加成员方法
#魔术方法
def __setattr__(self,attrname,value):#相当于在重载object中的__setattr__
#print('setattr方法被触发')
#1.禁止修改性别,2.修改名称最多使用三个字符多余的舍弃
if attrname == 'sex':
pass
else:
object.__setattr__(self,attrname,value)

def eat(self):
print('一天三顿小烧烤~')
def drink(self):
print('喝啤酒~')

# 实例化对象
df = Human()
print(df.__dict__)
#修改对象成员
df.name = '西门吹雪'
#查看修改之后的信息
print(df.__dict__)

#访问性别
print(df.sex)
#修改性别
df.sex = '女'
print(df.sex)

__delattr__

触发时机:删除对象成员的时候自动触发

作用:可以限制对象成员的删除

参数:一个self接受当前对象,另外一个接受删除的成员属性名称的字符串

返回值:无

注意事项:如果要删除对象成员,要借助object中的__delattr__来操作。

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
class Human:
#属性
color = 'yellow'
hair = '黑色'
#方法
def __init__(self):
#性名
self.name = '王老五'
#性别
self.sex = '男'
#年龄
self.age = 38

#魔术方法 (重载了继承自object类的删除成员的方法)
def __delattr__(self,attrname):
#print('delattr被触发')
#print(attrname,type(attrname))
#添加一个判断,判断是否允许删除成员
if attrname == 'sex':
pass
else:
#调用object类的删除成员方法(最原始的操作)
object.__delattr__(self,attrname)

#吃饭
def eat(self):
print('夏天就要吃小龙虾·!')
#喝水
def drink(self):
print('我喜欢喝冰糖雪梨')

#实例化对象
wlw = Human()
print(wlw.__dict__)
#删除对象的成员属性
#名字
del wlw.name
#性别(禁止删除性别)
del wlw.sex
#年龄
del wlw.age
print(wlw.__dict__)

__dir__

触发时机:使用dir函数操作对象的时候自动触发

作用:

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

返回值:有,必须是容器类数据

注意事项:

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
class Human:
#属性
color = 'yellow'
hair = '黑色'

#方法
def __init__(self):
self.name = '王老五'
self.sex = '男'
self.age = 38

#魔术方法d
def __dir__(self):
#print('dir方法被触发')
#预先处理对象成员信息,返回值作为dir函数的结果
#只返回用户定义的成员
#1.获取所有成员
allmember = list(self.__dict__) + list(Human.__dict__)
#['name', 'sex', 'age', '__module__', 'color', 'hair', '__init__', '__dir__', 'eat', 'drink', '__dict__', '__weakref__', '__doc__']
#2.筛选用户定义成员
ownmember = [i for i in allmember if not i.startswith('__') and not i.endswith('__')]
#3.返回结果
return ownmember

#吃饭
def eat(self):
print('夏天就要吃小龙虾·!')
#喝水
def drink(self):
print('我喜欢喝冰糖雪梨')

#实例化对象
wlw = Human()
#print(wlw)
#dir函数:获取当前对象所有可以访问的成员名称组成的列表
result = dir(wlw)
print(result)