Python内置函数1.3:反射与自省类

Python内置函数1.3:反射与自省类

反射与自省是Python中用于动态检查和操作对象属性的重要机制。此处详细介绍以下7个内置函数:callable(), delattr(), dir(), getattr(), hasattr(), setattr(), vars()


1. callable():可调用性检查

函数说明
检查对象是否可调用(即能否像函数一样使用括号 () 执行)。
可调用对象包括:函数、方法、类(调用时会实例化)、实现了 __call__ 方法的对象。

参数

  • object:任意Python对象。

返回值

  • boolTrue 表示可调用,False 反之。

使用示例

# 函数和类可调用
def func():
    pass
print(callable(func))          # 输出:True
print(callable(list))          # 输出:True

# 类实例是否可调用取决于是否实现 __call__
class Demo:
    def __call__(self):
        pass
demo = Demo()
print(callable(demo))          # 输出:True

# 普通实例不可调用
num = 42
print(callable(num))           # 输出:False

2. delattr():动态删除属性

函数说明
删除对象的指定属性。等效于 del object.attribute,但属性名以字符串形式动态指定。

参数

  • object:目标对象。
  • name:属性名的字符串(需存在,否则引发 AttributeError)。

返回值

  • 无(隐式返回 None)。

使用示例

class User:
    def __init__(self):
        self.name = "Alice"
        self.age = 30

user = User()

# 删除属性
delattr(user, "age")
print(hasattr(user, "age"))    # 输出:False

# 删除不存在的属性会报错
try:
    delattr(user, "address")
except AttributeError as e:
    print(e)                   # 输出:'User' object has no attribute 'address'

3. dir():列出对象属性

函数说明
返回对象的有效属性列表(包括方法、类变量等)。
若未提供参数,则返回当前作用域的变量名列表。

参数

  • object(可选):任意对象。

返回值

  • list:属性名字符串的列表。

使用示例

# 查看字符串对象的属性
print(dir("hello"))            # 输出:['__add__', '__class__', ... 'upper', 'zfill']

# 查看类的属性
class Demo:
    attr = 10
    def method(self):
        pass
print(dir(Demo))               # 输出包含 'attr', 'method' 的列表

# 无参数时返回当前作用域变量
x = 10
print(dir())                   # 输出:['Demo', 'x', ...(其他当前作用域变量)]

4. getattr():动态获取属性值

函数说明
获取对象的属性值。若属性不存在,可返回默认值或引发 AttributeError

参数

  • object:目标对象。
  • name:属性名的字符串。
  • default(可选):属性不存在时的返回值(若未提供则报错)。

返回值

  • 属性的值,或 default(若提供且属性不存在)。

使用示例

class Config:
    theme = "dark"
    timeout = 30

config = Config()

# 获取存在的属性
print(getattr(config, "theme"))    # 输出:"dark"

# 获取不存在的属性(提供默认值)
print(getattr(config, "font_size", 12))  # 输出:12

# 不提供默认值时报错
try:
    getattr(config, "font_size")
except AttributeError as e:
    print(e)                      # 输出:'Config' object has no attribute 'font_size'

5. hasattr():属性存在性检查

函数说明
检查对象是否拥有指定属性。等效于 getattr() 不报错的简化版。

参数

  • object:目标对象。
  • name:属性名的字符串。

返回值

  • boolTrue 表示属性存在,False 反之。

使用示例

class Book:
    title = "Python Guide"
    price = 99.9

book = Book()

print(hasattr(book, "title"))      # 输出:True
print(hasattr(book, "author"))     # 输出:False

6. setattr():动态设置属性

函数说明
为对象设置属性值。等效于 object.attribute = value,但属性名以字符串形式动态指定。

参数

  • object:目标对象。
  • name:属性名的字符串。
  • value:要设置的值。

返回值

  • 无(隐式返回 None)。

使用示例

class Car:
    pass

car = Car()

# 动态添加属性
setattr(car, "color", "red")
print(car.color)                  # 输出:"red"

# 覆盖已有属性
setattr(car, "color", "blue")
print(car.color)                  # 输出:"blue"

7. vars():返回对象属性字典

函数说明
返回对象的 __dict__ 属性(包含实例的属性和值的字典)。
若未提供参数,则返回当前局部作用域的变量字典(等价于 locals())。

参数

  • object(可选):任意对象(若对象无 __dict__ 则引发 TypeError)。

返回值

  • dict:属性名与值的字典,或当前作用域的变量字典。

使用示例

class Person:
    def __init__(self, name):
        self.name = name

person = Person("Bob")

# 查看实例的 __dict__
print(vars(person))               # 输出:{'name': 'Bob'}

# 无参数时返回当前作用域变量
x = 10
print(vars())                    # 输出:{'person': <Person object>, 'x': 10, ...}

# 内置类型可能无 __dict__
try:
    print(vars(100))
except TypeError as e:
    print(e)                     # 输出:vars() argument must have __dict__ attribute

注意事项

  • 使用 delattr()setattr() 时需确保属性存在或符合命名规范。
  • vars() 对无 __dict__ 的对象(如内置类型实例)会报错。
  • dir() 返回的属性列表可能包含大量内置魔法方法(如 __init__),需结合实际需求筛选。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值