python魔法方法之"[]拦截方法"(__setitem__和__getitem__)

[]拦截方法的意思就是通过"对象['属性或方法名']"这样的形式去访问和设置对象的属性或方法;

class Person:
    def __init__(self,name):
        self.name = name

p1 = Person('vincent')
# p1['name'] = 'xiaoming'    #TypeError: 'Person' object does not support item assignment
print(p1['name'])          #TypeError: 'Person' object is not subscriptable     

从上面的例子中可以看出,通常的对象是无法通过"对象['属性或方法名']"这样的形式去访问和设置对象的属性或方法;

class Person:
    def __init__(self,name):
        self.name = name
    def __getitem__(self, item):
        return getattr(self,item)
    def __setitem__(self, key, value):
        setattr(self,key,value)

p1 = Person('vincent')
p1['name'] = 'xiaoming'
p1['age']  = 18
print(p1['name'],p1['age'])     #xiaoming 18

通过重写__getitem__和__setitem__对象,成功实现了通过"对象['属性或方法名']"这样的形式去访问和设置对象的属性或方法。

原文地址:https://www.cnblogs.com/leilijian/p/13219573.html