Python反射机制详解:getattr、setattr与hasattr实战
本文深入解析Python中的反射机制,通过具体实例演示如何利用getattr、setattr和hasattr三个内置函数动态获取、设置及判断对象属性。文章包含完整的代码示例,展示如何根据字符串动态调用方法或修改对象状态,帮助开发者理解Python的动态特性及其在面向对象编程中的应用。
Python反射机制概述
反射
在Python中,反射是指程序能够检查自身或对象的能力,具体表现为通过一个对象实例,动态地获取其类型(type)、所属类(class)、属性(attribute)或方法(method)的机制。
反射相关的内建函数详解
函数与方法
内建函数:
getattr(object, name[, default]):该函数用于通过属性名(name)返回对象(object)的属性值。如果指定的属性不存在,且提供了default参数,则返回default;若未提供default,则抛出AttributeError异常。注意,name参数必须为字符串类型。
setattr(object, name, value):若对象已存在该属性,则覆盖原有值;若不存在,则新增该属性并赋值。
hasattr(object, name):用于判断对象是否包含名为name的属性,其中name必须为字符串类型,返回布尔值。
反射机制代码实战
介绍完基本概念后,我们通过具体的代码实例来深入理解这些函数的用法。
#!/usr/bin/env python
#-*-coding:utf8-*-
def bulk(self):
print("%s is jiao ...."%self.name)
class Dog(object):
def __init__(self,name):
self.name=name
def eat(self,food):
print("%s is eating ...."%self.name,food)
d= Dog("dfxa")
choice = input(">>:").strip()
if hasattr(d,choice): #判断一个d(对象)里是否有对应的choice字符串方法
# delattr(d,choice) # Deletes the named attribute from the given object.
# delattr(x, 'y') is equivalent to ``del x.y''
# 相当于 del d.choice
func = getattr(d,choice) #根据字符串去获取d对象里的对应方法的内存地址
func("cheng")
# attr = getattr(d,choice)
# setattr(d,choice,"drr")
else:
# 将给定对象的命名属性设置为指定值
setattr(d,choice,22) # choice是字符串,相当于 d.choice = z
print(getattr(d,choice))
print(d.name)
第二个代码示例:
def bulk(self):
print("%s is jiao ...."%self.name)
class Dog(object):
def __init__(self,name):
self.name=name
def eat(self,food):
print("%s is eating ...."%self.name,food)
d= Dog("dfxa")
choice = input(">>:").strip()
if hasattr(d,choice): #判断一个d(对象)里是否有对应的choice字符串方法
func = getattr(d,choice) #根据字符串去获取d对象里的对应方法的内存地址
func("cheng")
#不能直接print(d.choice) ,choice是一个字符串,应该按照下面的方法写
# attr = getattr(d,choice)
# print(attr)
else:
setattr(d,choice,bulk)
# 运行程序,输入talk相当于 d.talk = bulk,把bulk的内存地址赋给了talk
# 此时函数就是talk,talk() == 调用bulk()
#d.talk(d) #所以这里只能调用talk()
#动态的把类外面的方法装配到类里,通过字符串的形式,但调用需要把自己(对象)传进去
#这样的话就把函数写死了,另一种写法
func2 = getattr(d,choice)
func2(d) #这样不管输入的是talk还是bulk都可以
>>:talk
dfxa is jiao ....
至此,关于Python反射机制的实例代码分享已结束。如需了解更多Python反射相关内容,建议查阅本站往期文章或相关链接。感谢大家的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









