# getattr、setattr、delattr

# getattr

getattr​ 是 Python 内置函数,用于获取对象的属性值。具体来说,它的作用是返回指定对象的指定属性值。如果指定的属性不存在,还可以提供一个默认值,避免出现异常。它的语法如下:

getattr(object, name[, default])

其中,object​ 是需要获取属性值的对象,name​ 是需要获取的属性名,default​ 是可选的默认值,如果属性不存在时,会返回这个默认值。

下面是一些常见的使用示例:

# 定义一个类
class MyClass:
    foo = 42

# 获取对象的属性值
obj = MyClass()
print(getattr(obj, "foo"))  # 42

# 获取不存在的属性,返回默认值
print(getattr(obj, "bar", "default"))  # default

# 获取一个模块的属性值
import os
print(getattr(os, "path"))  # <module 'posixpath' from '/usr/lib/python3.9/posixpath.py'>

在实际编程中,getattr​​ 可以用于动态获取属性,可以在运行时根据需要获取某个对象的属性值,从而实现动态编程。

除了利用getattr​动态获取熟悉外,还可以使用operator​模块的methodcaller​函数。

import math
import operator

class Point:
    def __init__(self,x,y) -> None:
        self.x = x
        self.y = y
  
    def __repr__(self) -> str:
        return f"({self.x}, {self.y})"
  
    def distance(self,x,y):
        return math.hypot(self.x-x,self.y-y)

p = Point(2, 3)

d1 = getattr(p, 'distance')(0,0)
d2 = operator.methodcaller("distance", 0, 0)(p)
print(d1,d2)    # 3.605551275463989 3.605551275463989

# hasattr​、setattr​、​delattr

在 Python 中还有许多内置函数类似于 getattr()​,用于获取对象的属性或方法,例如:

  • hasattr(obj, name)​:判断对象 obj​ 是否存在名为 name​ 的属性或方法。
  • setattr(obj, name, value)​:将对象 obj​ 的属性或方法 name​ 的值设置为 value​。
  • delattr(obj, name)​:删除对象 obj​ 的名为 name​ 的属性或方法。