为什么'object'类没有用户设置属性

时间:2012-04-11 20:22:09

标签: python

python中的每个类都继承自类'对象'。我想知道'对象'类实现的内部机制。为什么不能为'object'类分配任何用户属性?我确信它与内存管理有关,但如果用户想要自己实现内存管理,为什么不能在python中覆盖'object'类呢?这是基于我的兴趣,并想知道哪些可能没有任何程序化应用程序,但很高兴知道语言本身的内部特性。

3 个答案:

答案 0 :(得分:3)

C中定义的类型永远不会有用户指定的属性。如果要全局替换object,则需要迭代现有的每个类,然后替换__builtin__.object以捕获将来创建的所有类。即使这样也不可靠,因为旧的物体可能被绑定在其他地方。

答案 1 :(得分:3)

这已经在StackOverflow上讨论过,但是我找不到链接它的讨论。

我想知道的原因是因为我想简化这个例子:

class Box(object):
    pass

box = Box()
box.a = "some value"
box.b = 42

这里我使用box作为一种字典,其中键只能是标识符。我这样做是因为写box.abox["a"]更方便。

我想这样做:

box = object()
box.a = "some value"  # doesn't work

原因是object是Python中所有对象的根。 object具有的任何属性必须属于任何派生类型。如果要创建包含大量对象的大型列表,则希望它们尽可能小,这样就不会耗尽内存。所以object本身很小。

编辑:我找到了我想要记住的链接:

struct objects in python

答案 2 :(得分:1)

如果我必须从第一原则推导出推理,我可能会根据__slots__机制来考虑它。某些类只需要很少的属性,并且每个实例的属性集总是固定的,因此像用户属性能力这样的“dict”的灵活性会浪费cpu(查找动态命名的属性)和space(空字典的开销,小而非零),如果有大量实例,这实际上可能会增加很多开销。

当然这正是__slots__机制解决的问题。在对象上为slot中定义的属性分配空间。如果有__dict__属性,则可以在那里找到非槽属性,如果没有__dict__属性,则既不会获得动态属性,也不会获得不需要的dict对象的成本(这是一个额外的堆)实例本身以外的对象。)

至于为什么object本身没有__dict__的插槽,嗯,即使子类表明他们没有需要 __dict__如果插槽继承自 的类,则实例必须仍然具有__dict__;如果object有一个__dict__那么绝对每个班级也会支付__dict__的费用,即使他们不需要它。

相反;子类获得__dict__(和__weakref__,出于类似的原因)除非他们自己定义__slots__类属性。

为什么你需要object的简单实例?你只需要一袋属性吗?然后使用dict。如果您确实需要具有行为和属性的某种对象,那么您无论如何都要创建一个子类。

关于我能想象使用object()而不是object的子类的唯一原因是,感兴趣的实例的唯一特征是它的身份。当函数接受参数时,会出现这种情况,并且应该将None或其他明显的标记值理解为与默认值不同:

BAR_DEFAULT = object()
def foo(bar=BAR_DEFAULT):
    if bar is BAR_DEFAULT:
        #...

在这种情况下,您既不需要也不特别需要object

实例上的属性
相关问题