各类资料学习下载合集 https://pan.quark.cn/s/8c91ccb5a474
在 Python 中,所有类都隐式地继承自根类 object。作为 Python 中的基类,object 提供了许多基本功能,其中 __dir__() 是一个非常重要但又常被忽略的方法,它用于返回一个对象的所有属性和方法的列表。在本文中,我们将详细解析 object 根类及其 __dir__() 方法的工作原理,并通过代码示例来帮助理解。
一、object 根类简介
在 Python 中所有的类都直接或间接继承自 object,因此它是 Python 中所有类的基类。即使没有显式声明,Python 也会默认让所有类继承 object。
class MyClass: # 等价于 class MyClass(object):
passobject 提供了一些默认的方法和属性,如 __str__()、__repr__()、__eq__() 等。无论是自定义类还是内置类型,都可以直接使用这些方法。
二、__dir__() 方法简介
__dir__() 是 object 提供的一个内置方法,用于返回一个对象的属性和方法列表。它通常在使用内置函数 dir() 时被调用。
dir() 和 __dir__() 的关系
dir(object)是一个内置函数,用于列出对象的所有属性和方法。- 实际上,
dir(object)会调用对象的__dir__()方法。 - 如果对象没有重写
__dir__()方法,Python 会返回默认行为。
三、__dir__() 的工作原理
- 默认行为:
如果一个类没有重写
__dir__()方法,则调用dir()会返回:
- 对象的实例属性(通过
self.xxx添加的属性)。 - 对象所属类和类的父类中定义的所有方法和属性。
- 自定义行为:
我们可以通过重写
__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__)和用户定义的属性(name、version)以及方法(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 还提供了一些其他重要的方法:
__str__():返回对象的字符串表示。__repr__():返回对象的开发者友好字符串表示。__eq__():比较两个对象是否相等。__hash__():返回对象的哈希值。
通过这些方法,object 为所有类提供了基本功能,用户可以根据需要重写这些方法来实现自定义行为。
六、总结
object是 Python 中所有类的根类。__dir__()是object提供的内置方法,用于列出对象的所有属性和方法。- 使用场景:
dir()函数通过调用__dir__()方法列出对象的内容。 - 灵活性:可以通过重写
__dir__()方法定制dir()的输出,以便控制哪些属性和方法对外可见。









