当前位置:首页 » 编程语言 » pythongetattr

pythongetattr

发布时间: 2024-01-29 13:31:36

A. python 如何查看object有哪些属性值

dir([obj]):
调用这个方法将返回包含obj大多数属性名的列表(会有一些特殊的属性不包含在内)。obj的默认值是当前的模块对象。
hasattr(obj, attr):
这个方法用于检查obj是否有一个名为attr的值的属性,返回一个布尔值。
getattr(obj, attr):
调用这个方法将返回obj中名为attr值的属性的值,例如如果attr为’bar’,则返回obj.bar。
setattr(obj, attr, val):
调用这个方法将给obj的名为attr的值的属性赋值为val。例如如果attr为’bar’,则相当于obj.bar = val。

B. python类的属性有哪几种如何访问它们

属性的访问机制

一般情况下,属性访问的默认行为是从对象的字典中获取,并当获取不到时会沿着一定的查找链进行查找。例如a.x的查找链就是,从a.__dict__['x'],然后是type(a).__dict__['x'],再通过type(a)的基类开始查找。

若查找链都获取不到属性,则抛出AttributeError异常。

一、__getattr__方法

这个方法是当对象的属性不存在是调用。如果通过正常的机制能找到对象属性的话,不会调用__getattr__方法。

classA:
a=1
def__getattr__(self,item):
print('__getattr__call')
returnitem

t=A()
print(t.a)
print(t.b)
#output
1
__getattr__call
b

二、__getattribute__方法

这个方法会被无条件调用。不管属性存不存在。如果类中还定义了__getattr__,则不会调用__getattr__()方法,除非在__getattribute__方法中显示调用__getattr__()或者抛出了AttributeError。

classA:
a=1
def__getattribute__(self,item):
print('__getattribute__call')
raiseAttributeError

def__getattr__(self,item):
print('__getattr__call')
returnitem

t=A()
print(t.a)
print(t.b)

所以一般情况下,为了保留__getattr__的作用,__getattribute__()方法中一般返回父类的同名方法:

def__getattribute__(self,item):
returnobject.__getattribute__(self,item)

使用基类的方法来获取属性能避免在方法中出现无限递归的情况。

三、__get__方法

这个方法比较简单说明,它与前面的关系不大。

如果一个类中定义了__get__(),__set__()或__delete__()中的任何方法。则这个类的对象称为描述符。

classDescri(object):
def__get__(self,obj,type=None):
print("callget")

def__set__(self,obj,value):
print("callset")

classA(object):
x=Descri()

a=A()
a.__dict__['x']=1#不会调用__get__
a.x#调用__get__
如果查找的属性是在描述符对象中,则这个描述符会覆盖上文说的属性访问机制,体现在查找链的不同,而这个行文也会因为调用的不同而稍有不一样:

  • 如果调用是对象实例(题目中的调用方式),a.x则转换为调用:。type(a).__dict__['x'].__get__(a, type(a))
  • 如果调用的是类属性,A.x则转换为:A.__dict__['x'].__get__(None, A)
  • 其他情况见文末参考资料的文档

  • 四、__getitem__方法

  • 这个调用也属于无条件调用,这点与__getattribute__一致。区别在于__getitem__让类实例允许[]运算,可以这样理解:
  • __getattribute__适用于所有.运算符;
  • __getitem__适用于所有[]运算符。
  • classA(object):

  • a=1


  • def__getitem__(self,item):

  • print('__getitem__call')

  • returnitem


  • t=A()

  • print(t['a'])

  • print(t['b'])

  • 如果仅仅想要对象能够通过[]获取对象属性可以简单的:

  • def__getitem(self,item):

  • returnobject.__getattribute__(self,item)

  • 总结

    当这几个方法同时出现可能就会扰乱你了。我在网上看到一份示例还不错,稍微改了下:

  • classC(object):

  • a='abc'


  • def__getattribute__(self,*args,**kwargs):

  • print("__getattribute__()iscalled")

  • returnobject.__getattribute__(self,*args,**kwargs)


  • #return"haha"

  • def__getattr__(self,name):

  • print("__getattr__()iscalled")

  • returnname+"fromgetattr"


  • def__get__(self,instance,owner):

  • print("__get__()iscalled",instance,owner)

  • returnself


  • def__getitem__(self,item):

  • print('__getitem__call')

  • returnobject.__getattribute__(self,item)


  • deffoo(self,x):

  • print(x)


  • classC2(object):

  • d=C()


  • if__name__=='__main__':

  • c=C()

  • c2=C2()

  • print(c.a)

  • print(c.zzzzzzzz)

  • c2.d

  • print(c2.d.a)

  • print(c['a'])

  • 可以结合输出慢慢理解,这里还没涉及继承关系呢。总之,每个以__get为前缀的方法都是获取对象内部数据的钩子,名称不一样,用途也存在较大的差异,只有在实践中理解它们,才能真正掌握它们的用法。

C. python自动化测试怎么将多个依赖数据

接口测试中,有些场景接口间存在着数据依赖的问题,比如说提交订单前需要用户先登录等等,下面就用两个小案例说说数据依赖的问题。

两个接口,一个接口(project_add)用来创建测试项目,一个接口(env_add)用来创建测试环境,env_add接口需依赖project_add接口返回的project_id字段数据。

一、Postman解决数据依赖的问题

这样数据依赖的问题就搞定了

二、用python代码实现接口数据依赖

用代码解决数据依赖的方法有多种,下面用反射来解决数据依赖的问题。

反射它可以把字符串映射到实例的变量或者实例的方法然后,可以去执行调用、修改等操作。

它有四个重要的方法:

getattr 获取指定字符串名称的对象属性

setattr 为对象设置一个对象

hasattr 判断对象是否有对应的对象(字符串)

delattr 删除指定属性

classRelyData(object):

project_id=Noneprint(RelyData.project_id)

setattr(RelyData,"project_id", "111")print(getattr(RelyData, "project_id"))

定义了一个RelyData()类,里面设置了一个类属性,project_id=None,然后再用setattr函数为对象RelyData里面project_id属性设置了新值,最后再用getattr函数取出里面的值,这是个属性值替换的过程。

classTest(unittest.TestCase):defsetUp(self):pass

deftest_1(self):"""添加项目接口"""url=
"http://127.0.0.1:8000/base/project_add/"headers= {'Content-Type':
'application/x-www-form-urlencoded'}

datas= {"prj_name": " search", "description": "网络搜索"}

response= requests.post(url, data=datas, headers=headers)print("response:", response.json())


D. 在Python中使用字符串调用函数

已有字符串形式的函数名称,那么如何调用这个函数呢?

通过调用内置函数locals()和globals()返回的字典对象,就可以可以获得名称与对象的映射关系。其中,locals()仅在全局范围内调用时可以获得函数对象。 我们来看以下的例子。

需要注意的是,使用上述方法通过字符串调用函数时,为了系统的安全,防止执行任意函数,需要对函数名做一些处理,也就是使用统一的前缀为这些函数命名。例如在上述例子中,使用前缀cmd_+函数名的形式定义函数(cmd_help,cmd_sum)。
在传入函数名字符串时,只传入函数名的后半部分(如"help","sum"),由程序添加前缀后组成完整的函数名,再调用该函数。

对于类的成员函数,则可以使用getattr()获得类成员函数。

上述代码通过字符串调用了类成员函数,与前一段代码执行的结果相同。

此外,还可以使用字典将字符串与函数对应起来调用,缺点就是每增加一个函数需要相应在字典对象中添加相应的键值,增加代码维护工作量。

以上代码在Python 3.6以上运行通过。

E. 怎么判断 Python 对象是否包含某个属性

顶级函数hasattr可以查看对象是否包含某某属性,这里的属性包括数据属性和方法。getattr可以获取属性。

如下举例说明。

a=[1,2,3]
print('列表有count属性:%s'%hasattr(a,'count'))
print('列表有append属性:%s'%hasattr(a,'append'))
print('列表有shift属性:%s'%hasattr(a,'shift'))
print('列表的count属性是方法:%s'%hasattr(getattr(a,'count'),'__call__'))
print('列表的append属性是方法:%s'%hasattr(getattr(a,'append'),'__call__'))
classmyclass():
def__init__(self):
self.valattr=3
defmethod(self):
pass
mc=myclass()
print('myclass有valattr属性:%s'%hasattr(mc,'valattr'))
print('myclass有method属性:%s'%hasattr(mc,'method'))
print('myclass的valattr属性是方法:%s'%hasattr(getattr(mc,'valattr'),'__call__'))
print('myclass的method属性是方法:%s'%hasattr(getattr(mc,'method'),'__call__'))
热点内容
Qt用ftp传文件 发布:2025-01-22 19:23:28 浏览:731
校园卡密码是什么 发布:2025-01-22 19:14:43 浏览:658
内存大小的存储 发布:2025-01-22 18:58:17 浏览:393
tampermonkey脚本 发布:2025-01-22 18:53:17 浏览:117
windows7共享文件夹 发布:2025-01-22 18:53:17 浏览:479
如何调节安卓手机的内存 发布:2025-01-22 18:49:30 浏览:639
佳能相机存储卡怎么取消 发布:2025-01-22 18:40:59 浏览:569
天猫宝贝上传 发布:2025-01-22 18:35:09 浏览:545
ipad如何登录金铲铲安卓账号 发布:2025-01-22 18:32:09 浏览:320
加密沟通 发布:2025-01-22 18:31:22 浏览:556