python中的每个类都继承自类'对象'。我想知道'对象'类实现的内部机制。为什么不能为'object'类分配任何用户属性?我确信它与内存管理有关,但如果用户想要自己实现内存管理,为什么不能在python中覆盖'object'类呢?这是基于我的兴趣,并想知道哪些可能没有任何程序化应用程序,但很高兴知道语言本身的内部特性。
答案 0 :(得分:3)
C中定义的类型永远不会有用户指定的属性。如果要全局替换object
,则需要迭代现有的每个类,然后替换__builtin__.object
以捕获将来创建的所有类。即使这样也不可靠,因为旧的物体可能被绑定在其他地方。
答案 1 :(得分:3)
这已经在StackOverflow上讨论过,但是我找不到链接它的讨论。
我想知道的原因是因为我想简化这个例子:
class Box(object):
pass
box = Box()
box.a = "some value"
box.b = 42
这里我使用box
作为一种字典,其中键只能是标识符。我这样做是因为写box.a
比box["a"]
更方便。
我想这样做:
box = object()
box.a = "some value" # doesn't work
原因是object
是Python中所有对象的根。 object
具有的任何属性必须属于任何派生类型。如果要创建包含大量对象的大型列表,则希望它们尽可能小,这样就不会耗尽内存。所以object
本身很小。
答案 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
,