isinstance

isinstance(obj, class_or_tuple)  →  bool

返回:如果 obj 是给定类或类型组合中的一个实例,则返回 True,否则返回 False

  • obj
    任意对象,Python 中的一切(包括自定义类实例、内建类型、函数、模块等)。

  • class_or_tuple

    • 可以是一个类型(class)或类型元组 (type1, type2, …)

    • 当传入元组时,如果 obj 属于元组中任一类型,结果即为 True

getattr

getattr(object, name: str, default: Any = _marker)  →  Any
  • 返回:对象 obj 的属性 name

  • 三种情况

    • 如果 obj 有该属性(包括通过类或基类、描述符获取),返回其值;

    • 如果没有该属性且提供了 default,则返回 default

    • 否则抛出 AttributeError

2. 参数说明

  • object:任意 Python 对象。

  • name:一个字符串,表示属性名。

  • default(可选):当属性不存在时返回的备选值

常见用法

class Foo:
    def __init__(self):
        self.x = 10
    def greet(self):
        return "hello"

f = Foo()
getattr(f, 'x')              # 10
getattr(f, 'greet')()        # "hello"
getattr(f, 'missing', 123)   # 123 (提供了 default)
getattr(f, 'missing')        # AttributeError

注意事项

hasattr vs getattr(..., default)

  • hasattr(obj, name) 本质上相当于:

__getattribute__ 的副作用

  • 如果类重写了 __getattribute__,那么任何一次属性访问都会走这个自定义钩子。

  • 在调试和读源码时要留意:getattr 不见得是简单地查字典,还可能触发自定义逻辑。

关联对比: