欢迎来到赛兔子家园

Python setattr()、getattr()、hasattr()函数用法详解

除了前面介绍的几个类中的特殊方法外,本节再介绍 3 个常用的函数,分别是 hasattr()、getattr() 以及 setattr。
Python hasattr()函数
hasattr() 函数用来判断某个类实例对象是否包含指定名称的属性或方法。该函数的语法格式如下:
hasattr(obj, name)

其中 obj 指的是某个类的实例对象,name 表示指定的属性名或方法名。同时,该函数会将判断的结果(True 或者 False)作为返回值反馈回来。

class CLanguage:
    def __init__ (self):
        self.name = "C语言中文网"
        self.add = "http://c.biancheng.net"
    def say(self):
        print("我正在学Python")
clangs = CLanguage()
print(hasattr(clangs,"name"))
print(hasattr(clangs,"add"))
print(hasattr(clangs,"say"))

程序输出结果:

True
True
True
显然,无论是属性名还是方法名,都在 hasattr() 函数的匹配范围内。因此,我们只能通过该函数判断实例对象是否包含该名称的属性或方法,但不能精确判断,该名称代表的是属性还是方法。
Python getattr()函数
getattr() 函数获取某个类实例对象中指定属性的值。没错,和 hasattr() 函数不同,该函数只会从类对象包含的所有属性中进行查找。
getattr() 函数的语法格式如下:
getattr(obj, name[, default])

其中,obj 表示指定的类实例对象,name 表示指定的属性名,而 default 是可选参数,用于设定该函数的默认返回值,即当函数查找失败时,如果不指定 default 参数,则程序将直接报 AttributeError 错误,反之该函数将返回 default 指定的值。

class PLanguage:
    c = 1
    d = 2
    def __init__(self):
        self.name = "赛兔子"
        self.add = "https://www.cnblogs.com/qingchengzi/p/18055134"

    def say(self):
        pass

# 通过类实例对象调用 __dict__
p_obj = PLanguage()

print(getattr(p_obj,"name"))
print(getattr(p_obj,"add"))
print(getattr(p_obj,"say"))
print(getattr(p_obj,"display","nodisplay"))

输出结果:

赛兔子
https://www.cnblogs.com/qingchengzi/p/18055134
<bound method PLanguage.say of <__main__.PLanguage object at 0x0000000002268358>>
nodisplay
可以看到,对于类中已有的属性,getattr() 会返回它们的值,而如果该名称为方法名,则返回该方法的状态信息;反之,如果该明白不为类对象所有,要么返回默认的参数,要么程序报 AttributeError 错误。
Python setattr()函数
setattr() 函数的功能相对比较复杂,它最基础的功能是修改类实例对象中的属性值。其次,它还可以实现为实例对象动态添加属性或者方法。
setattr() 函数的语法格式如下:
setattr(obj, name, value)

首先,下面例子演示如何通过该函数修改某个类实例对象的属性值:

class PLanguage:
    c = 1
    d = 2
    def __init__(self):
        self.name = "赛兔子"
        self.add = "https://www.cnblogs.com/qingchengzi/p/18055134"

    def say(self):
        pass
p_obj = PLanguage()
print(p_obj.name)
print(p_obj.add)
setattr(p_obj,"name","django")
setattr(p_obj,"add","https://www.cnblogs.com/qingchengzi/p/18054793")
print(p_obj.name)
print(p_obj.add)

运行结果:

赛兔子
https://www.cnblogs.com/qingchengzi/p/18055134
django
https://www.cnblogs.com/qingchengzi/p/18054793

甚至利用 setattr() 函数,还可以将类属性修改为一个类方法,同样也可以将类方法修改成一个类属性。例如:

def say(self):
    print("我正在学Python")

class PLanguage:
    c = 1
    d = 2

    def __init__(self):
        self.name = "赛兔子"
        self.add = "https://www.cnblogs.com/qingchengzi/p/18055134"

    def say(self):
        pass
p_obj = PLanguage()
print(p_obj.name)
print(p_obj.add)
setattr(p_obj,"name",say)
p_obj.name(p_obj)

程序运行结果:

赛兔子
https://www.cnblogs.com/qingchengzi/p/18055134
我正在学Python
显然,通过修改 name 属性的值为 say(这是一个外部定义的函数),原来的 name 属性就变成了一个 name() 方法
使用 setattr() 函数对实例对象中执行名称的属性或方法进行修改时,如果该名称查找失败,Python 解释器不会报错,而是会给该实例对象动态添加一个指定名称的属性或方法。例如:
def say(self):
    print("我正在学Python")

class PLanguage:
    c = 1
    d = 2
    def __init__(self):
        self.name = "赛兔子"
        self.add = "https://www.cnblogs.com/qingchengzi/p/18055134"

    def say(self):
        pass

p_obj = PLanguage()
setattr(p_obj,"name","django")
setattr(p_obj,"say",say)
print(p_obj.name)
p_obj.say(p_obj)

运行结果:

django
我正在学Python

 

posted on 2024-09-15 16:01  赛兔子  阅读(137)  评论(0)    收藏  举报

导航