Python 对象函数
上次修改时间:2025 年 4 月 11 日
这份综合指南探讨了 Python 的 object 函数,它是 Python 中所有类的基类。我们将涵盖它在继承、实例化和对象创建的实际示例中的作用。
基本定义
object 函数返回一个新的无特征对象,它是所有类的基础。它为特殊方法提供默认实现。
主要特征:它是 Python 类层次结构的根,提供默认的 __str__、__repr__ 和其他方法,并在创建新式类(Python 3+)时使用。
创建基本对象
以下是如何创建一个简单的对象实例并检查其属性。这演示了 object 函数最基本的使用方法。
# Create a basic object obj = object() # Examine its type and methods print(type(obj)) # <class 'object'> print(dir(obj)[:5]) # First 5 methods: ['__class__', '__delattr__', ...] print(isinstance(obj, object)) # True
此示例创建一个裸 object 实例并检查其类型和可用方法。 所有 Python 对象都继承自该基类。
dir() 函数显示 object 基类提供的默认方法,所有其他类都继承这些方法。
使用 object 作为基类
此示例演示了从 object 的显式继承,这在 Python 3 中是自动的,但在此处为了清晰起见而显示。
class MyClass(object): # Explicit inheritance (optional in Python 3)
pass
obj = MyClass()
print(isinstance(obj, object)) # True
print(issubclass(MyClass, object)) # True
# Compare with direct object instance
base_obj = object()
print(dir(obj)[:5] == dir(base_obj)[:5]) # True (same basic methods)
这表明即使我们创建自己的类,它也会隐式地继承自 object。 可用的基本方法与基本对象相同。
在 Python 2 中需要从 object 进行显式继承才能创建新式类,但在 Python 3 中这是可选的,因为所有类都是新式类。
对象标识比较
此示例使用 object 基类的默认实现来探讨对象标识和比较操作。
obj1 = object() obj2 = object() obj3 = obj1 print(obj1 is obj2) # False (different identities) print(obj1 is obj3) # True (same identity) print(obj1 == obj2) # False (default __eq__ compares identity) print(hash(obj1)) # Unique hash value based on identity
该示例表明,默认情况下,仅当对象实例是同一对象(标识比较)时,它们才比较相等。 这是基本行为。
hash 函数根据对象的标识返回一个值,该值与相等比较实现一致。
向对象添加属性
此示例显示了尝试向普通 object 实例添加属性时会发生什么情况,默认情况下这是不允许的。
obj = object()
try:
obj.attribute = "value"
except AttributeError as e:
print(f"Error: {e}") # can't set attributes of type 'object'
class CustomObject(object):
pass
custom_obj = CustomObject()
custom_obj.attribute = "value" # Works fine
print(custom_obj.attribute) # "value"
普通的 object 实例不允许属性赋值,而继承自 object 的自定义类允许。 这演示了基本行为。
存在限制是因为默认情况下 object 实例缺少 __dict__ 属性,该属性用于存储属性。
对象作为哨兵值
object 函数可用于创建唯一的哨兵值,因为每次调用都会创建一个具有唯一标识的不同对象。
MISSING = object()
DEFAULT = object()
def process_value(value=MISSING):
if value is MISSING:
print("No value provided")
elif value is DEFAULT:
print("Default value used")
else:
print(f"Processing: {value}")
process_value() # No value provided
process_value(DEFAULT) # Default value used
process_value("data") # Processing: data
当您需要在 None、missing 和默认值之间进行区分时,此模式非常有用。 每次 object() 调用都会创建一个唯一的哨兵。
标识比较 (is) 在这里是安全的,因为每次 object() 调用都会创建一个新的唯一实例,该实例不会等于任何其他对象。
最佳实践
- 显式继承: 为 Python 2 兼容性使用
class MyClass(object): - 哨兵值: 使用
object()作为唯一标记 - 属性处理: 记住普通对象不支持属性
- 默认方法: 根据需要重写
__str__、__eq__ - 标识操作: 理解基于默认标识的比较
资料来源
作者
列出所有 Python 教程。