Pyhton-@property装饰器-__getattr__()-__getattribute()

@property
pyton内置的@property装饰器可以把一个方法变成一个属性
python<br />class User:<br />&nbsp;&nbsp;&nbsp; def __init__(self):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.username='admin'<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.password='123456'<br /><br />&nbsp;&nbsp;&nbsp; @property<br />&nbsp;&nbsp;&nbsp; #pyton内置的@property装饰器可以把一个方法变成一个属性,通过user.info调用<br />&nbsp;&nbsp;&nbsp; def info(self):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return [self.username,self.password]<br />user= User()<br />print(user.info)<br />
# getattr()
如果存在__getattr__()的定义,访问object不存在的属性时会调用该方法,相当于php的__get()魔法函数
不存在定义时,访问不存在的属性会报 AttributeError
python<br />class User:<br />&nbsp;&nbsp;&nbsp; def __init__(self):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.uname='admin'<br />if __name__ == "__main__":<br />&nbsp;&nbsp;&nbsp; user = User()<br />&nbsp;&nbsp;&nbsp; print(user.passwd)<br /><br />#output:<br />#AttributeError: 'User' object has no attribute 'passwd'<br /><br />
python<br />class User:<br />&nbsp;&nbsp;&nbsp; def __init__(self):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.uname='admin'<br />&nbsp;&nbsp;&nbsp; def __getattr__(self, item):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(item,'not exits')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return self.uname<br />if __name__ == "__main__":<br />&nbsp;&nbsp;&nbsp; user = User()<br />&nbsp;&nbsp;&nbsp; print(user.passwd)<br />#output:<br />#passwd not exits<br />#admin<br /><br />

# getattribute()
__getattribute_是属性访问拦截器,就是当这个类的属性被访问时,会自动调用类的__getattribute__方法,相当于一个filter
python<br />class User:<br />&nbsp;&nbsp;&nbsp; def __init__(self):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.uname='admin'<br />&nbsp;&nbsp;&nbsp; def __getattribute__(self, item):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(item,'\t',end='')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if item == 'uname':<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 'admin'<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 'not exits'<br />if __name__ == "__main__":<br />&nbsp;&nbsp;&nbsp; user = User()<br />&nbsp;&nbsp;&nbsp; print(user.uname)<br />&nbsp;&nbsp;&nbsp; print(user.passwd)<br /><br />#output:<br />#uname &nbsp;&nbsp; &nbsp;admin<br />#passwd &nbsp;&nbsp; &nbsp;not exits<br />

# python对象自省机制
python<br />class User:<br />&nbsp;&nbsp;&nbsp; uname='Admin'<br />&nbsp;&nbsp;&nbsp; def __init__(self):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.uname='admin'<br /><br />if __name__ == "__main__":<br />&nbsp;&nbsp;&nbsp; user = User()<br />&nbsp;&nbsp;&nbsp; print(user.uname)<br />&nbsp;&nbsp;&nbsp; #打印对象的全部属性和值<br />&nbsp;&nbsp;&nbsp; print(user.__dict__)<br />&nbsp;&nbsp;&nbsp; #打印类的全部属性和值<br />&nbsp;&nbsp;&nbsp; print(User.__dict__)<br />&nbsp;&nbsp;&nbsp; #打印对象里的所有属性(只会打印出属性名称,不打印属性的值)<br />&nbsp;&nbsp;&nbsp; print(user.__dir__())<br /><br />#output:<br /># admin<br /># {'uname': 'admin'}<br /># ['uname', '__module__', '__init__', '__dict__', '__weakref__', '__doc__', '__repr__', '__hash__', '__str__', '__getattribute__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__new__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', '__format__', '__sizeof__', '__dir__', '__class__']<br /># {'__module__': '__main__', 'uname': 'Admin', '__init__': &lt;function User.__init__ at 0x000001EF86143040&gt;, '__dict__': &lt;attribute '__dict__' of 'User' objects&gt;, '__weakref__': &lt;attribute '__weakref__' of 'User' objects&gt;, '__doc__': None}<br /><br />
















posted @ 2022-04-25 12:08  h0cksr  阅读(39)  评论(0)    收藏  举报