类对象特殊方法__getattr__()、getitem()、setitem()、delitem()
__getattr__()
当访问实例对象的属性或方法时,如果指定的属性或方法不存在,就会抛出AttributeError,为了避免抛出此异常,可以在实例对象所对应的类对象中实现特殊方法__getattr__()
,这样,当指定的属性或方法不存在时,就会自动调用特殊方法__getattr__()
。
#!/usr/bin/python3
class MyClass(object):
def do_sth(self):
print('do_sth()被调用了')
def __getattr__(self, name):
if name == 'data': # 判断的是属性名,
return 20 # 返回的是属性值
elif name == 'do_sth1': # 判断的是方法名
return print # 返回的是方法名
else:
raise AttributeError('__getattr__()被调用了') # 都不匹配的话,就自定义异常
mc = MyClass()
mc.do_sth() # 这里找到了do_sth方法,直接进行调用
# 下面的属性或方法都不存在,因此调用特殊方法__getattr__(),属性名和方法名被当做实参传入,进而进行匹配,当这里都没有的时候,才抛出异常
print(mc.data) # 这里匹配到了data属性名,返回的就是20
mc.do_sth1('hello') # 这里匹配到了do_sth1,返回的是print函数,那么do_sth1就可以被当做print来调用
[root@lyucan ~]# ./28.py
do_sth()被调用了
20
hello
__getitem__()
、__setitem__()
、__delitem__()
对于自定义类对象的实例对象,在默认情况下,是不能像列表和字典那样使用中括号语法来操作数据的。
如果想让自定义类对象的实例对象可以像列表和字典那样使用[]语法操作数据,必须在自定义类对象中实现以下三个特殊方法:
1、__getitem__(self, key)
当执行操作“obj[key]”时,会自动调用该特殊方法。
2、__setitem__(self, key, value)
当执行操作“obj[key] = value”时,会自动调用该特殊方法。
3、__delitem__(self, key)
当执行操作“del obj[key]”时,会自动调用该他特殊方法。
#!/usr/bin/python3
class MyClass(object):
def __init__(self):
self.data = {}
def __getitem__(self, key):
return self.data[key]
def __setitem__(self, key, value):
self.data[key] = value
def __delitem__(self, key):
del self.data[key]
mc = MyClass()
mc['name'] = 'Jerry'
mc['age'] = 25
print(mc['name'])
print(mc['age'])
del mc['age']
print(mc['age'])
[root@lyucan ~]# ./29.py
Jerry
25
Traceback (most recent call last):
File "./29.py", line 27, in <module>
print(mc['age'])
File "./29.py", line 8, in __getitem__
return self.data[key]
KeyError: 'age'
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 289211569@qq.com