getattr,setattr,delattr

1.__getattr__

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

    # def __getattr__(self, item):
    #     print('你找的属性%s不存在'%item)

f1=Foo('alex')
print(f1.name)      #alex
print(f1.age)       #报错:AttributeError: 'Foo' object has no attribute 'age'
#类Foo本身就有内置函数__getattr__,当在类中又定义了一个__getattr__时,则执行的是新定义的

2.__setattr__

# class Foo:
#     def __init__(self,name):
#         self.name=name
#
#     def __setattr__(self, key, value):
#         print('执行__setattr__')
#
# f1=Foo('alex')             # 执行__setattr__
# print(f1.__dict__)          #{}
# #执行了自己定义的__setattr__,并不会真正往字典属性里传值


#要求:往字典属性里传值,值必须是str类型
class Foo:
    def __init__(self,name):
        self.name=name

    def __setattr__(self, key, value):
        print('执行__setattr__')
        if type(value) is str:
            print('开始设置属性')
            # self.key=value          #又触发__setattr__
            self.__dict__[key]=value
        else:
            print('必须是字符串类型')

f1=Foo('alex')             # 执行__setattr__
f1.age=18
print(f1.__dict__)          #{}
View Code

 3.__delattr__

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

    def __delattr__(self, item):
        print('执行__delattr__')
        # f1.__dict__.pop(item)           #这样才会真正的删除

f1=Foo('alex')
f1.age=18
print(f1.__dict__)          #{'name': 'alex', 'age': 18}
del f1.age                  #执行__delattr__
print(f1.__dict__)          #{'name': 'alex', 'age': 18}
View Code

猜你喜欢

转载自www.cnblogs.com/wuweixiong/p/10605829.html
今日推荐