attr方法笔记(反射)
attr方法笔记
attr中用到了四个内置面向对象方法(__getattr__,__setattr__,__hasattr__,__delattr__),这称为反射,由于python中一切皆对象,反射可以任意的根据字符串形式取对象中获取/修改/删除成员
对象的属性可能来自于其类定义,叫做类属性(class attribute)。
类属性可能来自类定义自身,也可能根据类定义继承来的。
一个对象的属性还可能是该对象实例定义的,叫做对象属性(object attribute)
class test() :
username = 'username值'
def hhh(self):
return '运行我'
def a(self):
return 1
p = test()
hasattr(object, name)
#hasattr(object, name)
print(hasattr(p,'username'))#判断一个对象中是否有其参数一样的类属性或者类方法,返回布尔值,hasattr方法在项目中使用较少因为直接可以用getattr(p,None)来代替
print(hasattr(p,'hhh'))
getattr(object, name[,default])
print(getattr(p,'username'))#获取一个对象中方法或者属性,参数为函数名或者变量名,使用getattr需要保证的是函数或者变量存在,不然会报错
print(getattr(p,'username')) print(getattr(p,'hhh'))#打印<bound method test.hhh of <__main__.test object at 0x0000000002564080>>
#getattr(p,'2222') #AttributeError: 'test' object has no attribute '2222'
getattr(p,'hhh')()#再加括号表示运行
print(getattr(p,'password',p.hhh()))#为了避免报错,如果找不到函数或者变量可以在后面再加上一个参数值,若不存在则返回默认变量
print(getattr(p,'password',p.hhh(),None))#None表示为空,不做处理
setattr(object, name, values)
#给对象的属性赋值,若属性不存在,先创建再赋值。
print(hasattr(p,'password'))#返回的一定是false
print(setattr(p,'password',test.username))#给password赋予username同样的属性
print(p.username)
print(p.password)#虽然pycharm报错了但是我们仍然可以运行,也就是说我们也可以通过这种办法给函数或者变量赋值 print(hasattr(p,'hhh'))
print(getattr(p,'cc',setattr(p,'cc',p.a())))
print(getattr(p,'cc'))#这样就生成了一个cc函数并且和a一样方法
setattr应用
#这样可以理解成a方法,hhh方法,调用一个a时,如果没有调用成功,把hhh方法变成a方法,继续运行a方法而不用大批量修改方法名
if getattr(p, "c", None) is None:
setattr(p, "c", p.hhh())
a = getattr(p, "c")
delattr(object,name)
#函数作用用来删除指定对象的指定名称的属性,和setattr函数作用相反
#删除属性 class Test:
def __init__(self,name):
self.name = name
aaa = 'aaa'
def bbb(self):
print(self.name)
delattr(test,'aaa')
print("删除aaa成功应该返回False:",hasattr(test,'aaa'))#删除成功返回false
#delattr(test,'name')没有实例化之前不能删除构造函数中的变量,直接报错
c = test(1)#实例化,下面是实例化之后的测试 #delattr(c,'ssd')#删除不存在的变量也会报错
delattr(c,'name')#用对象来删除变量
print("实例化之后可以直接删除构造函数中的变量",hasattr(c,'name'))#删除成功,返回False
#在引用name报错说明删除成功
#print(c.name)# AttributeError: 'test' object has no attribute 'name'
#不能删除方法
#delattr(c,'bbb')#AttributeError: bbb,但是不能删除对象的方法
内建sttr方法
# __setattr__:
# 当设置对象的属性时会触发,比如self.name = name,有几次赋值会触发几次运行,或者setattr()被调用时也会触发__setattr__。
#
# __delattr__:
# 当删除对象属性时会触发,比如del p.name或者调用delattr()时也会触发__delattr__。
#
# __getattr__:
# 此内置方法比较特殊,当对象的属性不存在时会触发执行__getattr__。
__getattribute__ 属性访问拦截器
常用于权限,日志
参考:
https://www.cnblogs.com/blackmatrix/p/5681480.html
https://blog.csdn.net/yitiaodashu/article/details/78974596
版权声明:本文原创发表于 博客园,作者为 RainBol本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
attr方法笔记(反射)的更多相关文章
- jquery中prop()方法和attr()方法的区别
最近在用jquery的时候遇到一个问题,那就是attr()方法,发现这个方法有时候使用会有一些说不出原因的问题.翻翻自己之前笔记发现,还有个函数prop(). 这两个函数都可以用来获取属性. jque ...
- 黑马程序猿————Java基础日常笔记---反射与正則表達式
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 黑马程序猿----Java基础日常笔记---反射与正則表達式 1.1反射 反射的理解和作用: 首 ...
- jquery中prop()方法和attr()方法
接着上一篇笔记的疑惑,找了下prop()方法和attr()方法的区别. 原来query1.6中新加了一个方法prop(),一直没用过它,官方解释只有一句话:获取在匹配的元素集中的第一个元素的属性值. ...
- jquery attr()方法
在JS中设置节点的属性与属性值用到setAttribute(),获得节点的属性与属性值用到getAttribute(),而在jquery中,用一个attr()就可以全部搞定了,赞一个先 ^^ jque ...
- jQ中对attr()方法的理解
在JS中设置节点的属性与属性值用到setAttribute(),获得节点的属性与属性值用到getAttribute(),而在jquery中,用一个attr()就可以全部搞定了,赞一个先 ^^jquer ...
- jQuery中attr()方法用法实例
本文实例讲述了jQuery中attr()方法用法.分享给大家供大家参考.具体分析如下: 此方法设置或返回匹配元素的属性值. attr()方法根据参数的不同,功能也不同. 语法结构一: 获取第一个匹配元 ...
- jquery attr()方法 添加,修改,获取对象的属性值。
jquery attr()方法 添加,修改,获取对象的属性值. jquery中用attr()方法来获取和设置元素属性,attr是attribute(属性)的缩写,在jQuery DOM操作中会经常用到 ...
- Jquery attr()方法 属性赋值和属性获取
jquery中用attr()方法来获取和设置元素属性,attr是attribute(属性)的缩写,在jQuery DOM操作中会经常用到attr(),attr()有4个表达式. 1. attr(属性名 ...
- jquery 的attr()方法解析
我想用jquery的attr()方法修改一个li小圆点的背景颜色和外边框的时候:刚开始 $("#shanghai-btn").attr({background:"#999 ...
随机推荐
- Eureka&Zookeeper&Consul 原理与对比
CAP 定理CAP定理:CAP定理又称CAP原则,指的是在一个分布式系统中,一致性(Consistency).可用性(Availability).分区容错性(Partition tolerance). ...
- 【网络开发】UDP组播接收端解析
UDP组播接收端解析 网络中的一台主机如果希望能够接收到来自网络中其它主机发往某一个组播组的数据报,那么这么主机必须先加入该组播组,然后就可以从组地址接收数据包.在广域网中,还涉及到路由器支持组播路由 ...
- PHP实现单点登录最简单的方法
PHP实现单点登录最简单的方法 用户在A登录 存入登录状态 登录B站(A的识别要传入B) 获取A的登录状态
- PC电脑看电视 / 电视直播 / 高清频道 / 直播源
打开方式 PotPlayer + .m3u播放列表 效果图 .m3u播放列表 #EXTM3U #EXTINF:150,CCTV1综合 http://183.251.61.207/PLTV/888888 ...
- [.Net] 一句话Linq(递归查询)
功能查询起止日期范围内连续的月份列表. /* Period */ cbxPeriod.DataSource = Enumerable.Range(, ).Select(t => DateTime ...
- [Oracle] - 使用 EXP / IMP 对数据库进行备份与还原
只有Oracle客户端环境,如何完整备份数据库? 方法1:在本地搭建与目标环境相同版本的服务端,远程访问执行导出命令.这种方式远程备份速度较慢(VPN环境下测试). 方法2:登陆客户端,先导出数据库表 ...
- 关于/etc/rc.local
/etc/rc.d/rc.local 用于添加开机启动命令 /etc/rc.local是/etc/rc.d/rc.local的软连接 简单来说 开机自启的
- Java多线程系列--AQS之 LockSupport
concurrent包是基于AQS (AbstractQueuedSynchronizer)框架的,AQS(JAVA CAS原理.unsafe.AQS)框架借助于两个类: Unsafe(提供CAS操作 ...
- Mybatis笔记3
Mybatis映射文件的SQL深入 (Mybatis今天学的不多,看了半天的mysql必知必会) 动态sql语句-if语句,查询一个用户的时候,有可能根据地址查询,用户名查询,性别查询等,所以需要动态 ...
- Python3遍历指定文件夹下所有文件及文件夹
采用os模块儿: import os def get_filelist(dir): for home, dirs, files in os.walk(dir): print("####### ...