Python-类对象特殊方法__getattr__()、__getitem__()、__setitem__()、__delitem__()

  1. 类对象特殊方法__getattr__()、getitem()、setitem()、delitem()
    1. __getattr__()
    2. __getitem__()、__setitem__()、__delitem__()

类对象特殊方法__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