0
点赞
收藏
分享

微信扫一扫

深入解析 object 根类及其 __dir__() 方法

各类资料学习下载合集       https://pan.quark.cn/s/8c91ccb5a474 

在 Python 中,所有类都隐式地继承自根类 object。作为 Python 中的基类,object 提供了许多基本功能,其中 __dir__() 是一个非常重要但又常被忽略的方法,它用于返回一个对象的所有属性和方法的列表。在本文中,我们将详细解析 object 根类及其 __dir__() 方法的工作原理,并通过代码示例来帮助理解。

一、object 根类简介

在 Python 中所有的类都直接或间接继承自 object,因此它是 Python 中所有类的基类。即使没有显式声明,Python 也会默认让所有类继承 object

class MyClass:  # 等价于 class MyClass(object):
    pass

object 提供了一些默认的方法和属性,如 __str__()__repr__()__eq__() 等。无论是自定义类还是内置类型,都可以直接使用这些方法。

二、__dir__() 方法简介

__dir__()object 提供的一个内置方法,用于返回一个对象的属性和方法列表。它通常在使用内置函数 dir() 时被调用。

dir() 和 __dir__() 的关系

  • dir(object) 是一个内置函数,用于列出对象的所有属性和方法。
  • 实际上,dir(object) 会调用对象的 __dir__() 方法。
  • 如果对象没有重写 __dir__() 方法,Python 会返回默认行为。

三、__dir__() 的工作原理

  1. 默认行为: 如果一个类没有重写 __dir__() 方法,则调用 dir() 会返回:
  • 对象的实例属性(通过 self.xxx 添加的属性)。
  • 对象所属类和类的父类中定义的所有方法和属性。
  1. 自定义行为: 我们可以通过重写 __dir__() 方法,来自定义 dir() 返回的内容。

四、代码案例及运行结果

示例 1:查看默认的 dir() 输出

class MyClass:
    def __init__(self):
        self.name = "Python"  # 实例属性
        self.version = 3.9

    def greet(self):  # 实例方法
        print(f"Hello, {self.name}!")

# 创建实例
obj = MyClass()

# 使用 dir() 查看对象的属性和方法
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__',
 'greet', 'name', 'version']

分析

  • dir(obj) 返回了对象的所有可访问属性和方法。
  • 包括默认的魔术方法(如 __init____str__)和用户定义的属性(nameversion)以及方法(greet)。

示例 2:重写 __dir__() 方法

class MyClass:
    def __init__(self):
        self.name = "Python"  # 实例属性
        self.version = 3.9

    def greet(self):  # 实例方法
        print(f"Hello, {self.name}!")

    def __dir__(self):
        return ['custom_attribute', 'custom_method']

# 创建实例
obj = MyClass()

# 使用 dir() 查看对象的属性和方法
print(dir(obj))

运行结果

['custom_attribute', 'custom_method']

分析

  • 通过重写 __dir__() 方法,我们改变了 dir(obj) 的行为。
  • 返回的结果只包含自定义的内容:custom_attribute 和 custom_method

示例 3:结合默认行为扩展 __dir__()

在某些情况下,我们可能希望在 dir() 的输出中增加一些自定义内容,同时保留默认行为。

class MyClass:
    def __init__(self):
        self.name = "Python"
        self.version = 3.9

    def greet(self):
        print(f"Hello, {self.name}!")

    def __dir__(self):
        # 获取默认的 dir() 内容,并扩展自定义属性
        default_dir = super().__dir__()
        custom_dir = ['custom_attribute', 'custom_method']
        return default_dir + custom_dir

# 创建实例
obj = MyClass()

# 使用 dir() 查看对象的属性和方法
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__',
 'custom_attribute', 'custom_method', 'greet', 'name', 'version']

分析

  • 使用 super().__dir__() 获取默认的 dir() 输出。
  • 将自定义内容 ['custom_attribute', 'custom_method'] 添加到默认输出中。
  • 最终返回的列表包含了默认行为和自定义内容。

五、扩展:object 根类的其他方法

作为 Python 的根类,object 还提供了一些其他重要的方法:

  1. __str__():返回对象的字符串表示。
  2. __repr__():返回对象的开发者友好字符串表示。
  3. __eq__():比较两个对象是否相等。
  4. __hash__():返回对象的哈希值。

通过这些方法,object 为所有类提供了基本功能,用户可以根据需要重写这些方法来实现自定义行为。

六、总结

  • object 是 Python 中所有类的根类
  • __dir__() 是 object 提供的内置方法,用于列出对象的所有属性和方法。
  • 使用场景dir() 函数通过调用 __dir__() 方法列出对象的内容。
  • 灵活性:可以通过重写 __dir__() 方法定制 dir() 的输出,以便控制哪些属性和方法对外可见。
举报

相关推荐

0 条评论