python中dir()与__dict__属性的区别浅析

yizhihongxing

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技术站

(0)
上一篇 2023年5月13日
下一篇 2023年5月13日

相关文章

  • 简单介绍Python的第三方库yaml

    下面我就来详细讲解一下Python的第三方库yaml。 什么是yaml YAML是一种常见的跨语言数据格式,在不同编程语言之间进行数据交换时通常使用。它是人类友易于阅读和写作。同时,它也是机器友可以通过解析器进行自动化处理。Python中的第三方库yaml就是用于解析和生成yaml格式的数据的。 Python第三方库yaml的安装 在使用Python第三方库…

    python 2023年5月13日
    00
  • 如何在 Windows 上安装 PyGI(Python Gobject Introspection)?

    【问题标题】:How to install PyGI (Python Gobject Introspection) on Windows?如何在 Windows 上安装 PyGI(Python Gobject Introspection)? 【发布时间】:2023-04-02 18:06:01 【问题描述】: 安装python解释器:http://pytho…

    Python开发 2023年4月8日
    00
  • Python Numpy中数组的集合操作详解

    Python Numpy中数组的集合操作详解 介绍 NumPy是一个开源的Python科学计算库,提供了许多用于处理多维数组的工具,其中包括了数组的集合操作。这些操作可以用于查找重复元素、组合和比较数组等。 在本文中,我们将详细介绍Python Numpy中数组的集合操作。我们将介绍以下集合操作: 去重 并集 交集 差集 去重 当处理大量数据时,可能需要查找…

    python 2023年5月13日
    00
  • Python标识符命名规范

    Python中的标识符一般有这几种:变量名、类名、函数名、模块名等,这些标识符的命名需要遵守一定的规范。 具体来讲,Python标识符的命名规则有以下几种: 标识符由字符(A~Z 和 a~z)、下划线和数字组成。 标识符的第一个字符不能是数字。 标识符不能和Python中的关键字相同。 Python标识符的字母严格区分大小写,也就是说,同样的单词,大小写不一…

    2022年11月13日
    10
  • 基于python list对象中嵌套元组使用sort时的排序方法

    在Python中,可以使用sort()方法对列表进行排序。当列表中的元素是元组时,sort()方法默认按照元组中第一个元素的大小进行排序。如果第一个元素相同,则按照第二个元素大小进行排序,以此类推。下面是一个示例,演示了如何对包含元组的列表进行排序: # 对包元组的列表进行排序 lst = [(3, 2), (1, 4), (2, 3), (1, 2)] l…

    python 2023年5月13日
    00
  • 基于Python实现的恋爱对话小程序详解

    基于Python实现的恋爱对话小程序详解 简介 本文讲解如何使用Python编写一个简单的恋爱对话小程序,用户可以随意选择角色性别,进行简单的对话交流。 准备工作 首先,你需要安装Python环境,推荐使用Python 3.6及以上版本。其次,你需要安装几个必要的模块,包括random和time。 import random import time 编写代码…

    python 2023年5月23日
    00
  • 详解Python PIL putdata()方法

    Python PIL库是Python中处理图像的重要库,其中putdata()方法是该库中用于像素级别修改图像的重要方法之一,下面是putdata()方法的详细攻略。 什么是putdata()方法 putdata()方法是Python PIL库中的一个方法,用于像素级别在图像上批量写入数据,它可以接收一个1维列表,将其中的值按照图像的行列顺序一一对应地写入到…

    python-answer 2023年3月25日
    00
  • python 包之 re 正则匹配教程分享

    Python 包之 re 正则匹配教程分享 什么是正则表达式(Regular Expression)? 正则表达式是一种用来描述、匹配,甚至替换文本的字符串模式。用于处理字符串文本非常方便和高效,是文本处理中最常用的工具之一。 Python 内置了一个用于正则表达式处理的模块——re。 re 包基础用法 1. 正则表达式的基本语法 在 re 中,正则表达式是…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部