美文网首页
Python setattr()、getattr()、hasat

Python setattr()、getattr()、hasat

作者: 秣禾 | 来源:发表于2022-05-22 21:16 被阅读0次

    介绍 3 个常用的函数,分别是 hasattr()、getattr() 以及 setattr。

    Python hasattr()函数

    hasattr() 函数用来判断某个类实例对象是否包含指定名称的属性或方法。该函数的语法格式如下:

    hasattr(obj, name)

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

    举个例子:

    <pre class="python sh_python snippet-formatted sh_sourceCode" style="margin: 0px; display: block; padding: 0px; font-size: 14px; line-height: 1.6em; color: rgb(102, 102, 102); white-space: pre-wrap; overflow-wrap: break-word; background: none; border: none; border-radius: 0px;">
    
    1.  class CLanguage:
    2.  def __init__ (self):
    3.  self.name = "C语言中文网"
    4.  self.add = "http://c.biancheng.net"
    5.  def say(self):
    6.  print("我正在学Python")
    
    8.  clangs = CLanguage()
    9.  print(hasattr(clangs,"name"))
    10.  print(hasattr(clangs,"add"))
    11.  print(hasattr(clangs,"say"))
    
    </pre>
    

    程序输出结果为:
    True
    True
    True

    显然,无论是属性名还是方法名,都在 hasattr() 函数的匹配范围内。因此,我们只能通过该函数判断实例对象是否包含该名称的属性或方法,但不能精确判断,该名称代表的是属性还是方法。

    Python getattr() 函数

    getattr() 函数获取某个类实例对象中指定属性的值。没错,和 hasattr() 函数不同,该函数只会从类对象包含的所有属性中进行查找。

    getattr() 函数的语法格式如下:

    getattr(obj, name[, default])

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

    举个例子:

    <pre class="python sh_python snippet-formatted sh_sourceCode" style="margin: 0px; display: block; padding: 0px; font-size: 14px; line-height: 1.6em; color: rgb(102, 102, 102); white-space: pre-wrap; overflow-wrap: break-word; background: none; border: none; border-radius: 0px;">
    
    1.  class CLanguage:
    2.  def __init__ (self):
    3.  self.name = "C语言中文网"
    4.  self.add = "http://c.biancheng.net"
    5.  def say(self):
    6.  print("我正在学Python")
    
    8.  clangs = CLanguage()
    9.  print(getattr(clangs,"name"))
    10.  print(getattr(clangs,"add"))
    11.  print(getattr(clangs,"say"))
    12.  print(getattr(clangs,"display",'nodisplay'))
    
    </pre>
    

    程序执行结果为:

    C语言中文网
    http://c.biancheng.net
    <bound method CLanguage.say of <main.CLanguage object at 0x000001FC2F2E3198>>
    nodisplay

    可以看到,对于类中已有的属性,getattr() 会返回它们的值,而如果该名称为方法名,则返回该方法的状态信息;反之,如果该明白不为类对象所有,要么返回默认的参数,要么程序报 AttributeError 错误。

    Python setattr()函数

    setattr() 函数的功能相对比较复杂,它最基础的功能是修改类实例对象中的属性值。其次,它还可以实现为实例对象动态添加属性或者方法。

    setattr() 函数的语法格式如下:

    setattr(obj, name, value)

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

    <pre class="python sh_python snippet-formatted sh_sourceCode" style="margin: 0px; display: block; padding: 0px; font-size: 14px; line-height: 1.6em; color: rgb(102, 102, 102); white-space: pre-wrap; overflow-wrap: break-word; background: none; border: none; border-radius: 0px;">
    
    1.  class CLanguage:
    2.  def __init__ (self):
    3.  self.name = "C语言中文网"
    4.  self.add = "http://c.biancheng.net"
    5.  def say(self):
    6.  print("我正在学Python")
    7.  clangs = CLanguage()
    8.  print(clangs.name)
    9.  print(clangs.add)
    10.  setattr(clangs,"name","Python教程")
    11.  setattr(clangs,"add","http://c.biancheng.net/python")
    12.  print(clangs.name)
    13.  print(clangs.add)
    
    </pre>
    

    程序运行结果为:

    C语言中文网
    http://c.biancheng.net
    Python教程
    http://c.biancheng.net/python

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

    <pre class="python sh_python snippet-formatted sh_sourceCode" style="margin: 0px; display: block; padding: 0px; font-size: 14px; line-height: 1.6em; color: rgb(102, 102, 102); white-space: pre-wrap; overflow-wrap: break-word; background: none; border: none; border-radius: 0px;">
    
    1.  def say(self):
    2.  print("我正在学Python")
    
    4.  class CLanguage:
    5.  def __init__ (self):
    6.  self.name = "C语言中文网"
    7.  self.add = "http://c.biancheng.net"
    
    9.  clangs = CLanguage()
    10.  print(clangs.name)
    11.  print(clangs.add)
    12.  setattr(clangs,"name",say)
    13.  clangs.name(clangs)
    
    </pre>
    

    程序运行结果为:

    C语言中文网
    http://c.biancheng.net
    我正在学Python

    显然,通过修改 name 属性的值为 say(这是一个外部定义的函数),原来的 name 属性就变成了一个 name() 方法。

    使用 setattr() 函数对实例对象中执行名称的属性或方法进行修改时,如果该名称查找失败,Python 解释器不会报错,而是会给该实例对象动态添加一个指定名称的属性或方法。例如:

    <pre class="python sh_python snippet-formatted sh_sourceCode" style="margin: 0px; display: block; padding: 0px; font-size: 14px; line-height: 1.6em; color: rgb(102, 102, 102); white-space: pre-wrap; overflow-wrap: break-word; background: none; border: none; border-radius: 0px;">
    
    1.  def say(self):
    2.  print("我正在学Python")
    
    4.  class CLanguage:
    5.  pass
    
    7.  clangs = CLanguage()
    8.  setattr(clangs,"name","C语言中文网")
    9.  setattr(clangs,"say",say)
    10.  print(clangs.name)
    11.  clangs.say(clangs)
    
    </pre>
    

    程序执行结果为:
    C语言中文网
    我正在学Python

    可以看到,虽然 CLanguage 为空类,但通过 setattr() 函数,我们为 clangs 对象动态添加了一个 name 属性和一个 say() 方法。

    相关文章

      网友评论

          本文标题:Python setattr()、getattr()、hasat

          本文链接:https://www.haomeiwen.com/subject/qpcgurtx.html