ZetCode

Python 对象函数

上次修改时间:2025 年 4 月 11 日

这份综合指南探讨了 Python 的 object 函数,它是 Python 中所有类的基类。我们将涵盖它在继承、实例化和对象创建的实际示例中的作用。

基本定义

object 函数返回一个新的无特征对象,它是所有类的基础。它为特殊方法提供默认实现。

主要特征:它是 Python 类层次结构的根,提供默认的 __str____repr__ 和其他方法,并在创建新式类(Python 3+)时使用。

创建基本对象

以下是如何创建一个简单的对象实例并检查其属性。这演示了 object 函数最基本的使用方法。

basic_object.py
# 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 中是自动的,但在此处为了清晰起见而显示。

inheritance.py
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 基类的默认实现来探讨对象标识和比较操作。

comparison.py
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 实例添加属性时会发生什么情况,默认情况下这是不允许的。

attributes.py
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 函数可用于创建唯一的哨兵值,因为每次调用都会创建一个具有唯一标识的不同对象。

sentinel.py
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() 调用都会创建一个新的唯一实例,该实例不会等于任何其他对象。

最佳实践

资料来源

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。 我自 2007 年以来一直在撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程