Python内置函数1.3:反射与自省类
反射与自省是Python中用于动态检查和操作对象属性的重要机制。此处详细介绍以下7个内置函数:callable()
, delattr()
, dir()
, getattr()
, hasattr()
, setattr()
, vars()
。
1. callable()
:可调用性检查
函数说明
检查对象是否可调用(即能否像函数一样使用括号 ()
执行)。
可调用对象包括:函数、方法、类(调用时会实例化)、实现了 __call__
方法的对象。
参数
object
:任意Python对象。
返回值
bool
:True
表示可调用,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
:属性名的字符串。
返回值
bool
:True
表示属性存在,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__
),需结合实际需求筛选。