HOWTO · Python
在 Python 中打印对象属性
本教程介绍如何在 Python 中打印对象属性,以及如何检查对象公开的名称和实例属性。
本页内容
如果要打印一个已知属性,可以用点号访问它的值,再将值传给 print()。如果属性名保存在字符串中,可以使用 getattr();若要检查对象实际存储的实例属性,可在对象提供相应字典时使用 __dict__ 或 vars();若要查看 Python 为对象公开了哪些名称,则可使用 dir()。这些方法呈现的是对象的不同视图,应根据需求选择:读取单个值、查看实例属性映射,或广泛发现可用名称。
Person 类可以定义类属性,而每个对象也可以保存自己的实例属性。下面的示例会创建一个包含姓名、年龄和城市的对象。
在 Python 中使用 print 和属性访问打印对象属性
已知属性名时,点号访问是最直接的读取方式。将属性值传给内置的 print() 函数即可:
class Person:
def __init__(self, name, age, city):
self.name = name
self.age = age
self.city = city
person = Person("John Doe", 30, "New York")
print(person.name)
John Doe
这个表达式读取该实例的 name 值,并将它写入标准输出。
在 Python 中使用 getattr 函数打印对象属性
当属性名保存在变量中,或需要在运行时确定时,可以使用 getattr()。它的第二个参数必须是字符串。可选的第三个参数是在属性名不可用时返回的默认值;如果省略默认值,属性不存在时会引发 AttributeError。
class Person:
def __init__(self, name, age, city):
self.name = name
self.age = age
self.city = city
person = Person("John Doe", 30, "New York")
attribute_name = "city"
city = getattr(person, attribute_name, "Unknown")
print(city)
New York
修改 attribute_name 可以选择其他属性,也可以按应用需要更换默认值。若省略第三个参数,找不到属性名时会引发 AttributeError。
在 Python 中使用 __dict__ 属性打印对象属性
如果实例提供 __dict__,它就是该实例的属性映射。映射中包含存储在实例上的属性,例如在 __init__ 中赋给 self.name 的值;它不包含仅在类上定义的属性。
class Person:
def __init__(self, name, age, city):
self.name = name
self.age = age
self.city = city
person = Person("John Doe", 30, "New York")
attributes = person.__dict__
print(attributes["name"])
John Doe
有些对象没有实例 __dict__,例如使用 __slots__ 且未提供字典的类的实例,因此这种方法并不适用于所有对象。
在 Python 中使用 dir() 函数打印对象属性
调用 dir(person) 会得到一个经过排序的名称列表,这些名称是 Python 为检查目的向该对象公开的。列表可能包含实例属性、类属性、方法和特殊名称,并不只是实例实际存储的数据。若要以更易读的布局显示较长的列表,可以使用标准库中的 pprint() 函数:
class Person:
def __init__(self, name, age, city):
self.name = name
self.age = age
self.city = city
person = Person("John Doe", 30, "New York")
print("name" in dir(person))
True
这个检查说明 name 属于对象公开的名称。具体有哪些名称取决于对象及其所属的类,自定义的 __dir__() 也会影响 dir() 的返回结果。因此,应把它视为发现名称的工具,而不是实例字典的快照。若要以易读的布局查看完整列表,可将 dir(person) 传给 pprint() 函数。
在 Python 中使用 vars() 函数打印对象属性
对于提供 __dict__ 的对象,vars(person) 会返回同一个实例属性映射。可以将该映射传给 pprint(),以便更清楚地阅读:
class Person:
def __init__(self, name, age, city):
self.name = name
self.age = age
self.city = city
person = Person("John Doe", 30, "New York")
print(vars(person)["name"])
John Doe
不带参数调用 vars() 用途不同:它会返回当前的本地符号表。对于没有 __dict__ 的对象,传入 vars() 会引发 TypeError。因此,当你需要实例属性映射且确定对象提供该映射时,才使用此函数。若要格式化完整映射,可将 vars(person) 传给 pprint() 函数。
总结
根据任务选择检查方式:要打印一个已知值,可用点号访问并调用 print();属性名是动态确定的,可用 getattr();要查看对象实际存储的实例属性,且对象提供字典时可用 __dict__ 或 vars();要发现范围更广的名称,则可用 dir()。请记住,dir() 可能包含方法和特殊名称,而实例字典只包含该实例存储的属性。