Python函数介绍:getattr()、setattr()、hasattr()
在Python中我们通常对类的操作中,常常会判定某个属性是否是在这个类中,也会动态的为这个类更改\增添的某些属性和方法。这时我们会常常用到这个几个重要的Python内置函数,分别是getattr()、setattr()、hasattr()。
1、getattr(obj, name[, default])
obj 表示指定的类实例对象(类对象),name 表示指定的类的成员名称(除了属性可以访问,方法也可以),而 default 是可选参数,用于设定该函数的默认返回值,即当函数查找失败时,如果不指定 default 参数,则程序将直接报 AttributeError 错误,反之该函数将返回 default 指定的值。我们需要注意的是这里的name是字符串类型,表示类成员的名称。看例子:
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表示更改后的值。该函数可以修改已经存在的成员,也可以添加不存在的成员。看例子:
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()要特别注意同名情况的处理。