前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >__setattr__,setattr(),getattr__,getattr()及__getattribute__的区别

__setattr__,setattr(),getattr__,getattr()及__getattribute__的区别

作者头像
全栈程序员站长
发布2022-11-15 18:14:31
3580
发布2022-11-15 18:14:31
举报
文章被收录于专栏:全栈程序员必看

Python 2.7 IDE Pycharm 5.0.3

首先,给一波定义

代码语言:javascript
复制
__setattr__(self,name,value)
#当试图给特性name赋值时候自动被调用,其余方法同理
#相当于触发机制

__getattribute__(self,item)
#每次通过实例化访问属性都会通过该函数
#如果没有该属性,则访问完该函数后,再会通过__getattr__函数

Jetbrains全家桶1年46,售后保障稳定


_setattr__getattr_

这里下面用网上比较热的代码进行测试和注释,因本人接触Python不足两星期,若有纰漏,请君不吝赐教;

代码语言:javascript
复制
class Book(object):
def __setattr__(self, key, value):
#给特性key赋值时候会被自动调用
if key == 'value1':#当name这个特性是'value1'时
print "key=value1时候跳进来了"
object.__setattr__(self, key, value - 100)#这个value1属性的值value=100,分清value和value1
else:
print "设置时候跳入else了"
object.__setattr__(self, key, value)#正常设置呗
def __getattr__(self, name):
try:
print "__getattr__被调用"
return object.__getattribute__(name)#__getattribute__当name被访问时就被调用
except:
return name + ' is not found!'
def __str__(self):
print "__str__被调用"
return self.name + ' cost : ' + str(self.value1)#这句作用是为了print c的时候显示而已
c = Book()
c.name = 'Python'#这里key = name,value= 'Python'
c.value1 = 100#凡是对属性进行设置的都会进入__setattr__()中
print "---------c.name--------"
print c.name#动态建立属性name,本身在class中不存在,故才调用__getattr__
print "--------c.value1-------"
print c.value1
print "-----------c-----------"
print c
print "---------c.Type--------"
print c.Type#看看有没有Type属性

结果如下:

代码语言:javascript
复制
设置时候跳入else了
key=value1时候跳进来了
---------c.name--------
Python
--------c.value1-------
0
-----------c-----------
__str__被调用
Python cost : 0
---------c.Type--------
__getattr__被调用
Type is not found!

注释解释的比较详细了,几乎把这几个函数都用了个遍,自己多看看多总结会有更多的收获,或许以后的某一天我回过头开看这段代码会显得多幼稚呢,哈哈。


setattr()和getattr()

接下来是对setattr()和getattr()的分析,刚开始学总容易把这个方法和上述的__setattr__()搞混,接下来演示下setattr()和getattr()方法的使用。

代码语言:javascript
复制
class GSA_atte():
def __init__(self):
self.num = 9
def power(self):
return self.num*self.num
gsa = GSA_atte()#类都要实例化,方法都是对实例进行操作的
print hasattr(GSA_atte(),'num')#相当于有没有num属性,返回布尔类型
print getattr(gsa,'num')#也可以用实例gsa
print getattr(gsa,'y','获取不到y属性')
#getattr(类名,'属性','没有这个属性输出这里')
#也可以用try,except语句来进行包裹代替上句
try:
getattr(gsa,'y')
except:
print('no y')
setattr(gsa,'y',10)#setatta不需要print
print '经过setattr设置参数之后,得到y:',getattr(gsa,'y')

程序跑出来的结果是:

代码语言:javascript
复制
------------hasattr(GSA_atte(),'num')--------- 
True
--------------getattr(gsa,'num')-------------- 
9
--------getattr(gsa,'y','获取不到y属性')-------- 
获取不到y属性
-----------------try--except----------------- 
no y
---------经过setattr设置参数之后,得到y:-------- 
经过setattr设置参数之后,得到y: 10

相信大家好好看下代码注释及结果就可以很快的理解其中的奥秘了。


7.18补充:_get_,_getattr_,_getattribute__call_

代码语言:javascript
复制
class C(object):
a = 'abc'
def __getattribute__(self, *args, **kwargs):
print("__getattribute__() is called")
return object.__getattribute__(self, *args, **kwargs)
def __getattr__(self, name):
print("__getattr__() is called ")
return name + " from getattr"
def __get__(self, instance, owner):
print("__get__() is called", instance, owner)
return self
def __call__(self, x):
print("__call__ is called")
print "x :"+str(x)
class C2(object):
d = C()
if __name__ == '__main__':
c = C()
c2 = C2()
print "------------c.a-------------"
print(c.a)
print "---------c.zzzzzz-----------"
print(c.zzzzzz)
print "-----------c2.d-------------"
c2.d
print "-----------c2.d.------------"
print(c2.d.a)#d是作为C2的一个属性被调用
print "----------c(200)------------"
print c(200)

运行结果是:

代码语言:javascript
复制
------------c.a-------------
__getattribute__() is called
abc
---------c.zzzzzz-----------
__getattribute__() is called
__getattr__() is called 
zzzzzz from getattr
-----------c2.d-------------
('__get__() is called', <__main__.C2 object at 0x0000000002DA92E8>, <class '__main__.C2'>)
-----------c2.d.------------
('__get__() is called', <__main__.C2 object at 0x0000000002DA92E8>, <class '__main__.C2'>)
__getattribute__() is called
abc
----------c(200)------------
__call__ is called
x :200
None

最后

果然基础语法还是需要多看多练习,不然真的就忘了,越不用越忘,以后看高级一点的项目代码可能就会很累了。


致谢

@MaxOmnis–python call 内置函数的使用 @luozhaoyu–python中get,getattr,getattribute的区别

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/226819.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月30日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 首先,给一波定义
  • _setattr_和_getattr_
  • setattr()和getattr()
  • 7.18补充:_get_,_getattr_,_getattribute_,_call_
  • 最后
  • 致谢
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档