Python中dir()与__dict__属性的区别浅析
前言
在Python语言中,dir()和__dict__两个方法都可以获取一个对象的属性、方法等信息。本文将对这两个方法进行区别和比较分析。
dir()方法
dir()函数是Python自带的一个函数,它返回任意对象的属性和方法列表。在交互模式下,我们可以显示一个对象的所有属性和方法。例如,以下是使用dir()函数获取dict对象属性的代码示例:
>>> dict1 = {"a":1, "b":2}
>>> dir(dict1)
['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
dir()函数一般用于获取一个对象可以使用的方法,而不是获取对象具体的属性值。
__dict__属性
__dict__属性是Python中内置的一个字典类型对象,它存储对象的属性。每个类的实例对象都有一个__dict__属性可以访问到,可以通过该属性查看和修改对象的属性。以下是使用对象的__dict__属性获取对象属性的代码示例:
>>> class Foo:
... def __init__(self, a):
... self.a = a
...
>>> b = Foo(2)
>>> b.__dict__
{'a': 2}
__dict__属性还可以用于给对象动态添加属性或修改属性。例如,以下是使用__dict__属性向对象添加属性的代码示例:
>>> class Foo:
... def __init__(self, a):
... self.a = a
...
>>> b = Foo(2)
>>> b.__dict__
{'a': 2}
>>> b.__dict__["b"] = 3
>>> b.__dict__
{'a': 2, 'b': 3}
区别和比较
在实际中,我们应该注意这两个方法的区别和使用场景。
- dir()方法一般用于获取Python内置数据类型(如dict、list、tuple等)的方法,方便用户使用这些数据类型。
- __dict__属性一般用于对象的属性存储和动态修改。
综上所述,dir()方法和__dict__属性的主要区别在于:
- dir()用于获取一个对象的方法列表,而__dict__用于获取一个对象的属性。
- dir()返回的是一个列表,包含了该对象可以使用的方法,而__dict__返回的是一个字典,包含了该对象的属性和属性值。
示例
下面是使用dir()和__dict__两个方法的另一个示例:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def say_hello(self):
print("Hello!")
person = Person("Tom", 20)
# 使用dir()获取Person类属性和方法
print("dir(Person)", dir(Person))
# 使用dir()获取person对象属性和方法
print("dir(person)", dir(person))
# 使用__dict__获取对象属性
print("person.__dict__", person.__dict__)
# 使用__dict__添加和修改person对象属性
person.__dict__["school"] = "ABC University"
person.__dict__["age"] = 21
# 使用__dict__获取修改后的person对象属性
print("person.__dict__", person.__dict__)
输出结果如下:
dir(Person) ['__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__', 'say_hello']
dir(person) ['__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__', 'age', 'name', 'say_hello']
person.__dict__ {'name': 'Tom', 'age': 20}
person.__dict__ {'name': 'Tom', 'age': 21, 'school': 'ABC University'}
在这个示例中,我们可以看到:
- 使用dir()函数获取Person类的属性和方法列表,包括类的属性和方法。
- 使用dir()函数获取person对象的属性和方法列表,包括对象自身的属性和方法和继承的属性和方法。
- 使用__dict__属性获取person对象的属性。
- 使用__dict__属性给person对象动态添加新属性和修改属性,并使用__dict__属性获取修改后的属性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python中dir()与__dict__属性的区别浅析 - Python技术站