如何在Python中判断对象是否具有某个属性?
Python 是一种面向对象的编程语言,这里的属性被称为对象的特性。我们可以使用不同的方法来检查对象是否具有某个属性。
要检查对象是否包含特定属性,可以使用 hasattr() 方法和 getattr() 方法。如果要获取所有现有属性,可以使用 dir() 方法。(了解更多关于Python目录的信息:Python 目录教程)
首先创建一个带有两个属性的 Python 虚拟类,然后将其赋值给一个对象,本文将始终引用该对象。
class DummyClass(): var1 = 'Value1' var2 = 2 obj = DummyClass()
直接访问属性
在这个例子中,我们尝试直接访问对象的属性,如果属性不存在,可能会得到一个 AttributeError。如果我们没有得到 AttributeError,那么就知道对象具有该属性。
示例
对于上述示例,对象不包含属性“a”,但包含“var1”、“var2”属性。
class DummyClass(): var1 = 'Value1' var2 = 2 obj = DummyClass() print(obj.var1) print(obj.var2) print(obj.a)
输出
Value1 2 Traceback (most recent call last): File "/home/cg/root/57371/main.py", line 8, inprint(obj.a) AttributeError: 'DummyClass' object has no attribute 'a'
使用 getattr() 方法访问属性
与直接访问属性类似,getattr() 方法也返回命名属性的值(如果存在),如果属性不存在则返回 AttributeError。
语法
getattr(object, name[, default])
此函数有三个参数:要查找其属性的对象名称、要检查的属性名称,以及最终的 [, default],它接受一个默认参数,如果属性不存在,则打印该参数,而不是生成 AttributeError。
示例
getattr() 方法返回现有属性的值,并为不存在的属性抛出默认参数或 AttributeError。
print(getattr(obj, 'var1', 'Attribute doesn't exist')) print(getattr(obj, 'var2', 'Attribute doesn't exist')) print(getattr(obj, 'a', 'Attribute doesn't exist')) print(getattr(obj, 'a'))
输出
Value1 2 Attribute doesn't exist Traceback (most recent call last): File "/home/cg/root/17209/main.py", line 9, inprint(getattr(obj, 'a')) AttributeError: 'DummyClass' object has no attribute 'a'
使用 hasattr() 方法访问属性
hasattr() 方法检查对象是否具有特定属性。hasattr() 方法是使用 getattr() 方法实现的。
语法
hasattr(object, name )
此函数有两个参数:对象的名称和要检查的属性名称。并返回一个布尔值(True/False)。如果对象中存在该属性,则返回 'True',否则返回 'False'。
示例
obj 方法不包含“a”属性,因此返回 False。对于 var1、var2 属性,它返回 True 作为输出。
class DummyClass(): var1 = 'Value1' var2 = 2 obj = DummyClass() print(hasattr(obj, 'var1')) print(hasattr(obj, 'var2')) print(hasattr(obj, 'a'))
输出
True True False
使用 dir() 方法访问所有现有属性
dir() 方法返回一个列表,其中包含对象的所有属性,它还会返回包含在 __dict__ 属性中的键。
语法
dir(object)
对于某些对象,dir() 的结果可能不准确,因为其功能可能已使用 __getattr__ 方法修改。
示例
dir() 方法返回所有现有属性的列表。
class DummyClass(): var1 = 'Value1' var2 = 2 obj = DummyClass() print(dir(obj))
输出
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'var1', 'var2']