在 Python 中迭代对象的属性
Iterate over an Object’s attributes in Python
遍历对象的属性:
- 使用
__dict__
属性获取包含对象的属性和值的字典。 - 使用该
dict.items()
方法获取字典项目的视图。 - 使用
for
循环遍历对象的属性。
主程序
class Employee(): cls_id = 'employee' def __init__(self, name, salary): self.name = name self.salary = salary emp1 = Employee('bobbyhadz', 100) # ✅ iterate through an object's attributes for attribute, value in emp1.__dict__.items(): # name bobbyhadz # salary 100 print(attribute, value) # ------------------------------------------- # ✅ using vars instead of __dict__ for attribute, value in vars(emp1).items(): # name bobbyhadz # salary 100 print(attribute, value)
如果您需要遍历对象的所有属性(包括类变量),请向下滚动到下一个副标题。
第一个示例使用__dict__
属性获取包含对象的属性和值的字典。
主程序
class Employee(): cls_id = 'employee' def __init__(self, name, salary): self.name = name self.salary = salary emp1 = Employee('bobbyhadz', 100) # 👇️ {'name': 'bobbyhadz', 'salary': 100} print(emp1.__dict__)
我们可以使用该dict.items()
方法来获取可以迭代的视图对象。
主程序
class Employee(): cls_id = 'employee' def __init__(self, name, salary): self.name = name self.salary = salary emp1 = Employee('bobbyhadz', 100) for attribute, value in emp1.__dict__.items(): # name bobbyhadz # salary 100 print(attribute, value)
dict.items方法返回字典
项((键,值)对)的新视图。
最后一步是使用for
循环迭代对象的属性。
使用属性的另一种方法__dict__
是使用内置vars()
函数。
主程序
class Employee(): cls_id = 'employee' def __init__(self, name, salary): self.name = name self.salary = salary emp1 = Employee('bobbyhadz', 100) for attribute, value in vars(emp1).items(): # name bobbyhadz # salary 100 print(attribute, value)
vars函数接受一个对象并返回给定模块、类、实例或任何其他具有属性的__dict__
对象的__dict__
属性。
如果提供的对象没有
属性,该vars()
函数将引发 a 。TypeError
__dict__
如果您需要在迭代时包含类变量,请使用该dir()
函数。
使用 dir() 遍历对象的属性
遍历对象的属性:
- 使用该
dir()
函数获取对象属性名称的列表。 - 可选择过滤掉以两个下划线和方法开头的属性。
- 使用
for
循环遍历对象的属性。
主程序
class Employee(): cls_id = 'employee' def __init__(self, name, salary): self.name = name self.salary = salary emp1 = Employee('bobbyhadz', 100) for attribute in dir(emp1): print(attribute, getattr(emp1, attribute)) result = [attribute for attribute in dir(emp1) if not attribute.startswith('__')] print(result) # 👉️ ['cls_id', 'name', 'salary']
dir函数返回对象属性名称的列表,并递归地返回其基类的属性名称。
主程序
class Employee(): cls_id = 'employee' def __init__(self, name, salary): self.name = name self.salary = salary emp1 = Employee('bobbyhadz', 100) # ['__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__', 'cls_id', 'name', 'salary'] print(dir(emp1))
您还可以将一个类传递给dir()
函数,它不只是接受实例。
如果您需要排除以两个下划线开头的属性,请使用列表理解。
主程序
class Employee(): cls_id = 'employee' def __init__(self, name, salary): self.name = name self.salary = salary emp1 = Employee('bobbyhadz', 100) attributes = [attribute for attribute in dir(emp1) if not attribute.startswith('__')] print(attributes) # 👉️ ['cls_id', 'name', 'salary'] for attr in attributes: # cls_id employee # name bobbyhadz # salary 100 print(attr, getattr(emp1, attr))
getattr()
如果您需要在给定属性名称作为字符串时获取属性的值,则可以使用该函数。getattr函数返回对象提供的属性的值。
该函数采用以下参数:
姓名 | 描述 |
---|---|
目的 | 应检索其属性的对象 |
姓名 | 属性的名称 |
默认 | 对象上不存在该属性时的默认值 |
如果您的类有方法,您可能还想在遍历对象的属性时排除这些方法。
主程序
class Employee(): cls_id = 'employee' def __init__(self, name, salary): self.name = name self.salary = salary def get_name(self): return self.name emp1 = Employee('bobbyhadz', 100) attributes = [attribute for attribute in dir(emp1) if not attribute.startswith('__') and not callable(getattr(emp1, attribute))] print(attributes) # 👉️ ['cls_id', 'name', 'salary'] for attr in attributes: # cls_id employee # name bobbyhadz # salary 100 print(attr, getattr(emp1, attr))
可调用
函数将一个对象作为参数,True
如果该对象看起来可调用则返回,否则False
返回。
我们使用该函数从属性中排除所有方法。
如果您只想遍历类的变量,则可以将类传递给dir()
函数,而不是实例。
主程序
class Employee(): cls_id = 'employee' another = 'foo' def __init__(self, name, salary): self.name = name self.salary = salary class_variables = [attribute for attribute in dir(Employee) if not attribute.startswith('__') and not callable(getattr(Employee, attribute)) ] print(class_variables) # 👉️ ['another', 'cls_id'] for attr in class_variables: # another foo # cls_id employee print(attr, getattr(Employee, attr))
我们将类传递给dir()
函数,并在迭代之前过滤掉所有以两个下划线开头的类变量和所有类方法。