2018-07-09-Python全栈开发day26-python中内置的attr方法-__getattr__,__delattr__,__setattr__

1.__getattr__(self,item)

class Test:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def fangfa(self):
        print('this is a test')
    def __getattr__(self, item):#item的值就是对象的方法,在找不到对象是触发
        print('can not get the %s' %item)
p1=Test('yehaibin',18)
print(p1.name)
print('===>')
print(p1.alex)

2.__delattr__

  

class Test:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def fangfa(self):
        print('this is a test')
    def __delattr__(self, item):#item的值就是对象的方法,在找不到对象是触发
        print('I had delete this %s' %item)

p1=Test('yehaibin',18)
del p1.name#删除name属性时,出发delattr,打印
print(p1.__dict__)#输出p1的属性字典,发现name并没有实际被删除
print(p1.name)
print('===>')

I had delete this name {'name': 'yehaibin', 'age': 18} yehaibin ===>

  3. __setattr__

    

class Test:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def fangfa(self):
        print('this is a test')

    def __setattr__(self, key, value):#key就是属性,value就是属性的值
        print(key,value)


p1=Test('yehaibin',18)
p1.alex='hahaha'#设置或者修改属性时调用setattr

4. 通过代码实现系统内置操作

  

class Test:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __getattr__(self, item):#self是实例
        return 'i can not find your item'
    def __setattr__(self, key, value):#如果直接使用self,key=value的话是进入无限递归,调用setattr方法
        self.__dict__[key]=value
    def __delattr__(self, item):
        self.__dict__.pop(item)
p1=Test('yehaibin',18)
#查看方法
print(p1.alex)#输出getattr的返回值
#设置方法
p1.name='alex'#设置一个新属性
print(p1.name)#输出这个属性
print(p1.__dict__)#查看属性字典是否真的改变
#删除方法
del p1.age
print(p1.__dict__)

猜你喜欢

转载自www.cnblogs.com/hai125698/p/9286661.html