世外云

浅谈Python由__dict__和dir引发的一些思考「python中的dict」

Python中的`__dict__`和`dir()`是两个非常常用的内置函数,它们在Python的面向对象编程中起着重要的作用,本文将深入探讨这两个函数的作用、用法以及一些相关的思考。

我们来了解一下`__dict__`,在Python中,每个对象都有一个特殊的属性`__dict__`,它是一个字典,用于存储该对象的属性和方法,当我们访问一个对象的某个属性时,Python会首先在对象本身查找该属性,如果找不到,就会去该对象的类中查找,如果还是找不到,就会去该类的基类中查找,以此类推,而`__dict__`就是用来存储这些属性的地方。

浅谈Python由__dict__和dir引发的一些思考「python中的dict」-图1

我们定义一个简单的类:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

然后创建一个Person对象:

p = Person("Tom", 18)

我们可以使用`__dict__`来查看Person对象的属性:

print(p.__dict__)  # 输出:{'name': 'Tom', 'age': 18}

接下来,我们来了解一下`dir()`,`dir()`是一个内置函数,用于返回一个对象的所有属性和方法的列表,它与`__dict__`类似,但`dir()`返回的是对象的所有属性和方法,而不仅仅是实例属性。

浅谈Python由__dict__和dir引发的一些思考「python中的dict」-图2

我们可以使用`dir()`来查看Person类的所有属性和方法:

print(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__']

通过对比`dir()`和`p.__dict__`的输出结果,我们可以看到,`dir()`返回的结果中包含了一些特殊方法和内置方法,而`p.__dict__`只包含了实例属性。

在使用`__dict__`和`dir()`时,有一些需要注意的地方:

1. `__dict__`只能获取到实例属性,不能获取到类属性和静态属性,而`dir()`可以获取到所有属性和方法,包括实例属性、类属性和静态属性。

浅谈Python由__dict__和dir引发的一些思考「python中的dict」-图3

2. `__dict__`是一个字典,可以直接修改其中的元素,而`dir()`返回的是一个列表,不能直接修改其中的元素。

3. `dir()`返回的列表中包含了一些特殊方法和内置方法,这些方法通常不需要我们手动调用,因此在实际开发中,我们通常会忽略这部分内容。

我们来看一个问题与解答的栏目:

问题1:如何在Python中获取一个对象的所有属性和方法?

可以使用`dir()`函数来获取一个对象的所有属性和方法。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def say_hello(self):
        print("Hello, my name is", self.name)

创建Person对象:

获取Person对象的所有属性和方法:

attributes_and_methods = dir(p)
print(attributes_and_methods)  # 输出:['_Person__age', '_Person__name', 'say_hello', 'name', 'age']

问题2:如何在Python中为一个对象添加新的属性?

可以通过修改对象的`__dict__`来实现为一个对象添加新的属性。

为Person对象添加新的属性:

p.__dict__["gender"] = "male"  # 添加一个新的实例属性gender,值为"male"
print(p.__dict__)  # 输出:{'name': 'Tom', 'age': 18, 'gender': 'male'}
分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
请登录后评论...
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~