各类资料学习下载合集 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__()
的工作原理
- 默认行为:
如果一个类没有重写
__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()
的输出,以便控制哪些属性和方法对外可见。