反射前面我们已经学过了,那么为什么还要写这一篇呢,因为__getattribute__这个属性拦截器,但是在某些情况下使用起来,对应的意义不一样。除了属性拦截器之外,它也能跟反射达到类似的效果,至于它的称呼,也有称之为反射。

直接上实例吧:

_ _ getattr_ _

class Name(object):def __init__(self, name, text, info):self.name = nameself.text = textself.info = info"""查找不到属性的时候调用"""def __getattr__(self, item):return self.info['text']
if __name__ == '__main__':n = Name('QA', '你好', info={"text": '找不到啦'})print(n.text)print(n.ddd)

首先我们看到__getattr__,看到代码中的文字描述了。这里就不多阐述了。

_ _ getattribute_ _

class Name(object):def __init__(self, name, text, info):self.name = nameself.text = textself.info = info"""查找不到属性的时候调用"""def __getattr__(self, item):return self.info['text']def __getattribute__(self, item):return '你好啊,托马'if __name__ == '__main__':n = Name('QA', '你好', info={"text": '找不到啦'})print(n.text)print(n.ddd)

接上一个例子,我们这直接新增一个方法进去,此处会发生什么呢?他为什么会被叫做属性拦截器?运行看看结果:

你好啊,托马
你好啊,托马

可以看到,并没有返回我们所想象的内容,例如说打印的结果是你好,找不到啦等。而是直接返回了__getattribute__的返回值。我们调用属性的时候,都被直接拦截了,可以理解为,__getattribute__的优先级最高,不论你调用那个属性,优先进入__getattribute__被执行。

好了,上述两个例子可能并不是你想要了解的内容。那么我们结合selenium来跑一跑。这里运用了部分的POM思想来写,首先写一个简单的底层PY:

# -->>>托马<<<---
from selenium import webdriver
from time import sleepclass Test(object):def __init__(self):self.fox = webdriver.Firefox()self.fox.get('https://d2.shopxo.vip/')def get_element(self, *local):return self.fox.find_element(*local)def get_text(self, *local):sleep(1)txt = self.get_element(*local)print(txt.text)

此处命名随意。符合规则就好,然后我们再来看看另一个文件,命令随意,符合规则就行。

getattr

from class_getattr import Test
from selenium.webdriver.common.by import Byt = Test()
getattr(t, 'get_text')(By.XPATH, '//div[@class="menu-hd"]')

先来看看反射getattr,反射在前面的内容中我们讲到过具体的用法,可以节省很多的代码量,此处就不做多的阐述了。这就是比较简单的一种传值用法。

既然是传值,那么我们是不是可以用变量进行替代呢?

用变量替代能完成什么事情,为什么要在selenium里面说。selenium写起来比较的麻烦,所以,此处我们以简单的例子,说明原理,用法。介绍思想,直接用于难得项目中实践即可。

重点:

用变量代替实际得值,我们可以反复的利用。可以写一个方法,比如说:

from class_getattr import Test
from selenium.webdriver.common.by import Byt = Test()
def attr_(fun,location,ele)getattr(t, fun)(location, ele)

这样我们可以实现一个关键字传参的这么一个过程。至于如何实现,是在py文件里面写,还是用excel还是yaml亦或者其他的文件,那就看个人了。

_ _ getattribute_ _

上面我们已经见过这个了,属性拦截器,那么这里为什么又要讲它。因为它可以跟getattr近乎类似。

from class_getattr import Test
from selenium.webdriver.common.by import Byt = Test()
t.__getattribute__('get_text')(By.XPATH, '//div[@class="menu-hd"]')

看上述的例子瞬间秒懂了吧,只是传值的方式不一样,实际实现的效果,依然可以获取到text文本值。

总结

getattr是Python的内置函数之一,它的作用是获取对象的属性。

object.__getattribute__是一个对象方法,当访问某个对象的属性时,会无条件的调用这个方法。该方法应该返回属性值或者抛出AttributeError异常。而具体的实例上面已经介绍了,自己可以用在代码中试一试。

而属性拦截器__getattribute__,在类中的使用的时候优先级也是最高的,这个方法用的好则是神器,用不好就是累赘。慎用。

Python--getattr、__getattr__、__getattribute__,倔强一下相关推荐

  1. python getattr和getattribute_python中__getattr__和__getattribute__区别

    重载__getattr__方法对类及其实例未定义的属性有效.如果访问的属性存在,就不会调用__getattr__方法.这个属性的存在,包括类属性和实例属性 classClassA: x= 'a' de ...

  2. Python getattr() 函数==>获取一个对象的属性值

    描述 getattr() 函数用于返回一个对象属性值. 语法 getattr 语法: getattr(object, name[, default]) 参数 object -- 对象. name -- ...

  3. python getattr和getattribute_python中__get__、__getattr__、__getattribute__详解

    __get__,__getattr__和__getattribute__(只存在于新式类)都是访问属性的方法,但有一定的区别. object.__getattr__(self, name) 通过实例访 ...

  4. python getattr和getattribute_详解Python中 __get__和__getattr__和__getattribute__的区别

    引子 假设我们有个类A,其中a是A的实例 a.x时发生了什么?属性的lookup顺序如下: 如果重载了__getattribute__,则调用. a.__dict__, 实例中是不允许有descrip ...

  5. python getattr和getattribute_Python的__getattr__和__getattribute__

    __getattr__ __getattr__在当前主流的Python版本中都可用,重载__getattr__方法对类及其实例未定义的属性有效.也就属性是说,如果访问的属性存在,就不会调用__geta ...

  6. python 内置属性__setattr___python 自定义属性访问 __setattr__, __getattr__,__getattribute__, __call__...

    object._getattr_(self, name) __gettattr__:如果某个类定义了这个方法,并且在该类的对象的字典中又找不到相应的属性时候,那么该方法会被调用. 实例instance ...

  7. python中get属性_python3中__get__,__getattr__,__getattribute__的区别

    __get__,__getattr__和__getattribute都是访问属性的方法,但不太相同. object.__getattr__(self, name) 当一般位置找不到attribute的 ...

  8. python中setattr用法_python 中__setattr__, __getattr__,__getattribute__, __call__使用方法

    object._getattr_(self, name) 拦截点号运算.当对未定义的属性名称和实例进行点号运算时,就会用属性名作为字符串调用这个方法.如果继承树可以找到该属性,则不调用此方法 实例in ...

  9. python getattr和getattribute_getattr与getattribute的区别__

    让我们看看__getattr__和__getattribute__魔术方法的一些简单示例. __getattr__ 每当您请求尚未定义的属性时,Python将调用__getattr__方法.在下面的示 ...

  10. python getattr函数_[转]Python中的getattr()函数详解

    看了下函数本身的doc getattr(object, name[, default]) -> value Get a named attribute from an object; getat ...

最新文章

  1. Java中的HashCode(2)之Hashset造成的内存泄露
  2. 数据蒋堂 | 数据压缩手段
  3. SQL Server使用视图做权限控制
  4. selenium操作chrome时的一些配置
  5. 数据传输完整性_电缆监测数据传输系统分析与设计
  6. I2C总线串行串行输入输出结构
  7. 学python电脑要装什么_初学 Python 需要安装哪些软件?
  8. videojs如何获取请求消息_消息队列中,如何保证消息的顺序性?
  9. 常见报错_mysql常见报错之SELECT list is not in GROUP BY clause
  10. swoft使用phpunit之CodeCoverage
  11. Latice CPLD jed转VME文件简介
  12. mvn 命令上传文件到 Maven 仓库
  13. NHibernate之旅(9):探索父子关系(一对多关系)
  14. Pseudo-伪标签
  15. Caché 命令大全
  16. python学习之打印机
  17. NLP Learning | 初识NLP
  18. minisys-单周期cpu(一) 数据通路设计
  19. 用Selenium库获取网页源代码:新浪财经股票信息
  20. java与模式 之,《java与模式》学习之状态模式

热门文章

  1. 总结最近遇到的几个问题
  2. 前端简单入门第十八讲 使用jQuery实现表格的隔行换色
  3. 第1次作业:软件工程之计算机生涯序言
  4. 小混混n多天不提编程,深刻反思
  5. rice计算机专业排名,2020年Rice计算机工程排名指南总汇完整版
  6. HTML+CSS大作业——旅游—我的家乡新密(15页)含论文 新密旅游网页设计制作 简单静态HTML网页作品 我的家乡网页作业成品 学生旅游网站模板
  7. Minecraft 1.12.2模组开发(一) 配置ForgeMDK环境
  8. 菊风:一分钟,带你了解 RCS Native
  9. zookeeper 分布式barrier
  10. java方法的重载和方法的重写的区别