如何知道 Python 中某个对象是否具有属性?

pythonserver side programmingprogramming

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。对于 var1var2 属性,它返回 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']


相关文章