Python函数介绍:getattr()、setattr()、hasattr()
在Python中我们通常对类的操作中,常常会判定某个属性是否是在这个类中,也会动态的为这个类更改\增添的某些属性和方法。这时我们会常常用到这个几个重要的Python内置函数,分别是getattr()、setattr()、hasattr()。
1、getattr(obj, name[, default])
obj 表示指定的类实例对象(类对象),name 表示指定的类的成员名称(除了属性可以访问,方法也可以),而 default 是可选参数,用于设定该函数的默认返回值,即当函数查找失败时,如果不指定 default 参数,则程序将直接报 AttributeError 错误,反之该函数将返回 default 指定的值。我们需要注意的是这里的name是字符串类型,表示类成员的名称。看例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class MyClass: name = "类变量name" def __init__( self , name, age): self .name = name self .add = age def say( self ): print (f "{self.name}正在学Python" ) boy = MyClass( "小王" , 14 ) print ( "访问实例属性: " , getattr (boy, "name" )) print ( "访问类属性: " , getattr (MyClass, "name" )) print ( "访问类的方法: " , getattr (boy, "say" )) my_fun = getattr (boy, "say" ) my_fun() print ( getattr (boy, "friends" , "无朋友" )) |
我们创建了一个类MyClass,这个类有一个类成员(属性)name是所有实例对象公用的,这个类还有一个成员是say这个函数。代码第11行我们创建了一个对MyClass实例对象,并在之后通过使用getattr()函数访问实例对象的相关属性。并且在15行时,用my_fun这个变量指向了boy.say方法,我们在16行执行my_fun时其实就是在执行boy.say()。因此上述代码最终执行结果如下:
从例子中可以看到,我们对实例对象的所包括的成员通过getattr()访问,也可以对类对象包括的成员进行访问(如代码的第13行)。甚至我们可以将实例的某些方法进行引用(代码的15行)。
2、setattr(obj, name, value)
setattr()函数可以修改类实例对象(或类对象)中的成员值。其次,它还可以为实例对象(或类对象)动态添加属性或者方法。obj表示指定的类对象(或实例对象),name是成员(可以是属性,也可以是方法)名字的字符串,value表示更改后的值。该函数可以修改已经存在的成员,也可以添加不存在的成员。看例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | class MyClass: name = "类变量name" def __init__( self , name, age): self .name = name self .add = age def say( self ): print (f "{self.name}正在学Python" ) boy = MyClass( "小王" , 14 ) print ( "修改前实例名: " , boy.name) setattr (boy, "name" , "修改后的名字" ) print ( "修改后实例名: " , boy.name) setattr (MyClass, "name" , "修改类变量" ) print ( "\n修改后类变量: " , MyClass.name) def new_fun(): print ( "\n动态实例函数被执行" ) def new_class_fun( self ): print (f "\n可以访问实例对象的成员: {self.name}" ) setattr (boy, "newFun1" , new_fun) setattr (MyClass, "newFun2" , new_class_fun) boy.newFun1() boy.newFun2() |
我们依然是在11行处生成了一个对象,在13行时我们将boy这个对象的name属性(注意这里只会改变实例属性name,类属性并不会被改变)。第16行我们通过传入类对象,改变类的属性name。第20行和第23行我们在类的外部定义了两个函数,其中new_class_fun()函数有一个参数需要传入。26行和27行我们将这两个函数分别绑定到了boy实例对象和MyClass类对象上。因此我们就可以调用这些方法了。下面是执行结果。
需要注意的是我们给类对象赋予方法时,这些方法需要至少传入一个参数才行,这个参数在实例对象调用时默认传入的是对象本身。
3、hasattr(obj, name)
hasattr() 函数用来判断某个实例对象(或者类对象)是否包含指定名称的属性或方法。如果包含则返回True,否则返回False。这个函数比较简单就不给例子了。
4、总结
setattr()、getattr()是Python用于方便我们对类或者实例进行动态操作的函数,需要提到的是其寻找属性的顺序是:如果传入的是实例对象,那么将会从实例对象成员——>类成员——>父类成员的顺序进行寻找,如果在某一层找到符合name的成员名则停止查找,因此我们在使用setattr()、getattr()要特别注意同名情况的处理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南