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方法笔记(反射)的更多相关文章

  1. jquery中prop()方法和attr()方法的区别

    最近在用jquery的时候遇到一个问题,那就是attr()方法,发现这个方法有时候使用会有一些说不出原因的问题.翻翻自己之前笔记发现,还有个函数prop(). 这两个函数都可以用来获取属性. jque ...

  2. 黑马程序猿————Java基础日常笔记---反射与正則表達式

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 黑马程序猿----Java基础日常笔记---反射与正則表達式 1.1反射 反射的理解和作用: 首 ...

  3. jquery中prop()方法和attr()方法

    接着上一篇笔记的疑惑,找了下prop()方法和attr()方法的区别. 原来query1.6中新加了一个方法prop(),一直没用过它,官方解释只有一句话:获取在匹配的元素集中的第一个元素的属性值. ...

  4. jquery attr()方法

    在JS中设置节点的属性与属性值用到setAttribute(),获得节点的属性与属性值用到getAttribute(),而在jquery中,用一个attr()就可以全部搞定了,赞一个先 ^^ jque ...

  5. jQ中对attr()方法的理解

    在JS中设置节点的属性与属性值用到setAttribute(),获得节点的属性与属性值用到getAttribute(),而在jquery中,用一个attr()就可以全部搞定了,赞一个先 ^^jquer ...

  6. jQuery中attr()方法用法实例

    本文实例讲述了jQuery中attr()方法用法.分享给大家供大家参考.具体分析如下: 此方法设置或返回匹配元素的属性值. attr()方法根据参数的不同,功能也不同. 语法结构一: 获取第一个匹配元 ...

  7. jquery attr()方法 添加,修改,获取对象的属性值。

    jquery attr()方法 添加,修改,获取对象的属性值. jquery中用attr()方法来获取和设置元素属性,attr是attribute(属性)的缩写,在jQuery DOM操作中会经常用到 ...

  8. Jquery attr()方法 属性赋值和属性获取

    jquery中用attr()方法来获取和设置元素属性,attr是attribute(属性)的缩写,在jQuery DOM操作中会经常用到attr(),attr()有4个表达式. 1. attr(属性名 ...

  9. jquery 的attr()方法解析

    我想用jquery的attr()方法修改一个li小圆点的背景颜色和外边框的时候:刚开始 $("#shanghai-btn").attr({background:"#999 ...

随机推荐

  1. python解包

    概念 python的解包可以这样来理解:把元素给拆分并把其赋值给自己所需要的变量,因此元素应该是一个可迭代对象. 形式 简单版本 下面展示的是解包的基本形式,根据长度赋值给对应多的变量. name_l ...

  2. 【GStreamer开发】GStreamer播放教程03——pipeline的快捷访问

    目的 <GStreamer08--pipeline的快捷访问>展示了一个应用如何用appsrc和appsink这两个特殊的element在pipeline中手动输入/提取数据.playbi ...

  3. commands模块【转】

    https://www.cnblogs.com/wjoyxt/p/5087951.html 要获得shell命令的输出只需要`cmd`命令就可以了, 需要得到命令执行的状态则需要判断$?的值, 在Py ...

  4. Linux 实现回收站功能脚本

    #!/bin/bash function z-trash() { # 判断参数是否为空 if [ ! $1 ] then echo "z-trash error: file name of ...

  5. 下载安装Git,学习笔记

    官方地址为:https://git-scm.com/download/win 2.下载完之后,双击安装,全部选择默认. 3.选择安装目录 4.选择组件 5.开始菜单目录名设置  6.选择使用命令行环境 ...

  6. PHP中的PDO数据对象

    PDO: PHP Data Object:php的数据对象.pdo是数据库操作工具类!1,它能操作很多种数据库,比如mysql,oracle,sybase....2,它具有操作数据库的更多的功能,比如 ...

  7. Linux中光标消失解决办法

    假如Linux下光标消失,不要急: echo -e "\033[?25l"  隐藏光标 echo -e "\033[?25h" 显示光标 (转载自:https: ...

  8. C++语言动态创建对象

    焦头烂额的考试月终于过去了,终于有时间能停下来思考记录一下这一个月学过的东西,首先先总结一下,在自己仿写魂斗罗游戏时遇见的问题之一,人物在移动的时候如何去判断什么时候掉入水中显示水中画面,什么时候敌人 ...

  9. 如何在mongoengine中使用referencefield引用本类

    引用:原文 from mongoengine import * class Employee(Document): name = StringField() boss = ReferenceField ...

  10. python之numpy和pandas

    一.numpy矩阵的拼接合并 列拼接:np.column_stack() >>> import numpy as np >>> a = np.arange(9).r ...