python 中getattr(object,name,default),setattr(object,name,default),hasattr(),delattr()

本文详细介绍了Python中的自省函数getattr、setattr、delattr及hasattr的使用方法,并通过实例展示了如何利用这些函数进行属性获取、设置和删除,以及如何检查对象属性的存在。

getattr()函数是Python自省的核心函数,具体使用大体如下:

获取对象引用getattr
Getattr用于返回一个对象属性,或者方法


  1. class A:   
  2.     def __init__(self):   
  3.         self.name = 'zhangjing'  
  4.     #self.age='24'
  5.     def method(self):   
  6.         print"method print"  
  7.   
  8. Instance = A()   
  9. print getattr(Instance ,'name, 'not find') #如果Instance 对象中有属性name则打印self.name的值,否则打印'not find'
  10. print getattr(Instance ,'age', 'not find')   #如果Instance 对象中有属性age则打印self.age的值,否则打印'not find'
  11. print getattr(a,'method', 'default')   
  12. #如果有方法method,否则打印其地址,否则打印default  
  13. print getattr(a,'method', 'default')()   
  14. #如果有方法method,运行函数并打印None否则打印default 
注:使用getattr可以轻松实现工厂模式。
例:一个模块支持html、text、xml等格式的打印,根据传入的formate参数的不同,调用不同的函数实现几种格式的输出:

  1. import statsout   
  2. def output(data, format="text"):                                
  3.      output_function = getattr(statsout, "output_%s" % format)   
  4.     return output_function(data) 
setattr(object, name, value)

This is the counterpart of getattr(). The arguments
are an object, a string and an arbitrary value. The string may name an existing
attribute or a new attribute. The function assigns the value to the attribute,
provided the object allows it. For example, setattr(x,
'foobar', 123)
is equivalent to
x.foobar = 123.

 这是相对应的getattr()。参数是一个对象,一个字符串和一个任意值。字符串可能会列出一个现有的属性或一个新的属性。这个函数将值赋给属性的。该对象允许它提供。例如,setattr(x,“foobar”,123)相当于x.foobar = 123。

delattr(   object, name)

This is a relative of setattr(). The arguments are
an object and a string. The string must be the name of one of the object’s
attributes. The function deletes the named attribute, provided the object allows
it. For example, delattr(x, 'foobar') is
equivalent to del x.foobar.

与setattr()相关的一组函数。参数是由一个对象(记住python中一切皆是对象)和一个字符串组成的。string参数必须是对象属性名之一。该函数删除该obj的一个由string指定的属性。delattr(x, 'foobar')=delx.foobar

 

 

  • hasattr用于确定一个对象是否具有某个属性。

    语法:
     hasattr(object, name) -> bool
    判断object中是否有name属性,返回一个布尔值。
    

>>> li=["zhangjing","zhangwei"]

>>> getattr(li,"pop")
<built-in method pop of list object at 0x011DF6C0>
>>> li.pop
<built-in method pop of list object at 0x011DF6C0>

>>> li.pop()
'zhangwei'

>>> getattr(li,"pop")()
'zhangjing'

>>>getattr(li, "append")("Moe") 


<think>嗯,用户想了解Python中的callable和getattrsetattrdelattrhasattr这些函数的关系和用法。首先,我需要回忆这些函数各自的作用,然后看看它们之间有什么联系。先分开来看,hasattr用于检查对象是否有某个属性,setattr用来设置属性值,getattr获取属性值,delattr删除属性。而callable则是判断一个对象是否可以被调用,比如函数或类。这些函数都属于Python的内置函数,用于动态处理对象的属性。 接下来,需要理清它们之间的关系。例如,当使用getattr获取一个属性时,如果该属性是一个方法(即可调用的),那么可以用callable来验证。或者,在动态调用方法前,先用hasattr检查是否存在,再用callable确认是否可执行。用户可能在实际开发中遇到动态处理对象属性的情况,比如根据输入的字符串调用不同的方法,这时候结合使用这些函数会很方便。比如,检查对象是否有某个方法(hasattr),确认方法存在后再判断是否可调用(callable),最后用getattr获取并执行。 还需要注意异常处理,比如使用delattr删除属性时,如果属性不存在会引发AttributeError,所以可能需要结合try-except块或者先用hasattr检查。此外,在动态设置属性时,setattr可以直接赋值,但如果属性名是变量,这会很有用。另外,引用中提到的一些情况,比如在__getattr__方法中避免无限循环,可能需要通过直接操作__dict__来实现。这点虽然和用户的问题没有直接关联,但如果在动态属性管理时涉及到这些魔术方法,需要注意。用户的问题可能还涉及到如何组合使用这些函数来实现动态行为。例如,在插件系统中动态加载模块的方法,或者根据配置调用不同的函数。这时候,hasattrgetattr配合使用,再加上callable检查,可以确保调用的有效性。 需要举例说明每个函数的用法,以及它们如何协同工作。比如,一个对象可能有多个方法,根据用户输入动态选择执行哪个方法。这时候,先用hasattr检查是否存在,再用getattr获取,callable判断是否可调用,最后调用。 另外,callable不仅可以用于方法,还可以用于其他可调用对象,比如类、lambda函数等。所以,在动态获取属性后,用callable确认是否可调用,可以增加代码的健壮性。可能还需要提到这些函数与__getattr__、__setattr__等魔术方法的关系,比如当使用getattr时,会触发对象的__getattr__方法,如果存在的话。但用户的问题可能更关注于内置函数的使用,而不是魔术方法的覆盖。 最后,总结它们的关系:hasattr用于检查属性是否存在,getattr获取属性值,setattr设置,delattr删除,而callable则判断获取的属性是否可调用。这些函数共同支持了Python中动态属性管理的功能。</think>### Python动态属性管理与可调用对象检测 在Python中,`callable()`与`hasattr()`/`getattr()`/`setattr()`/`delattr()`共同构成动态属性管理的核心工具组,其关系与用法可通过以下结构化分析理解: --- #### 一、基础功能对比 1. **属性检测** `hasattr(obj, 'attr')`:判断对象是否包含指定属性(包括继承属性) ```python class Data: def __init__(self): self.value = 42 obj = Data() print(hasattr(obj, 'value')) # True ``` 2. **属性操作** - `getattr(obj, 'attr', default)`:获取属性值,支持默认值[^1] - `setattr(obj, 'attr', value)`:动态设置/修改属性[^1] - `delattr(obj, 'attr')`:删除属性(需配合异常处理)[^3] 3. **可调用性验证** `callable(obj.attr)`:判断属性是否为函数/方法/类等可调用对象 --- #### 二、组合应用场景 **案例:动态方法调用** ```python class Calculator: def add(self, a, b): return a + b calc = Calculator() method_name = 'add' if hasattr(calc, method_name): # 1.检测方法是否存在 func = getattr(calc, method_name) # 2.获取方法引用 if callable(func): # 3.验证可调用性 print(func(3, 5)) # 输出8 ``` **关键流程**: `存在性检测 → 属性获取 → 可调用性验证 → 执行调用` --- #### 三、特殊注意事项 1. **`delattr()`的异常处理** 删除不存在的属性会触发`AttributeError`,需配合`try-except`或前置`hasattr()`检查[^3]: ```python try: delattr(obj, 'non_existent_attr') except AttributeError as e: print(f"删除失败: {e}") ``` 2. **动态属性与`__dict__`的关系** 直接操作`obj.__dict__`可避免触发`__getattr__`/`__setattr__`的递归调用问题[^4] 3. **方法链式调用** `getattr()`可直接返回方法并立即调用: ```python getattr(calc, 'add')(3, 5) # 等效于calc.add(3,5) ``` --- #### 四、核心区别总结 | 函数 | 作用域 | 返回值类型 | 典型应用场景 | |---------------|----------------|-----------------|--------------------------| | `hasattr()` | 属性存在性检测 | 布尔值 | 动态功能开关控制 | | `getattr()` | 属性值获取 | 任意类型 | 插件系统/反射编程 | | `setattr()` | 属性赋值 | None | 运行时配置注入 | | `delattr()` | 属性删除 | None | 资源释放/状态重置 | | `callable()` | 可调用性验证 | 布尔值 | 安全执行回调函数 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值