如何在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, in
print(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, in
print(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']