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

Jac*_*des 7 python

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

Sin*_*ion 1

如果我必须从第一原理得出推理,我可能会从机制的角度来思考__slots__。某些类型的类只需要少量的属性,并且每个实例的属性集始终是固定的,因此像用户属性功能这样的“字典”的灵活性会浪费CPU(查找动态命名的属性)和空间(空字典的开销,小但非零),如果有大量实例,这确实会增加很多开销。

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

至于为什么object它本身没有 ; 的槽位__dict__,那么,即使子类表明它们不需要槽位__dict__,如果它们继承自一个需要该槽位的类,那么该实例仍然必须有一个__dict__; 如果object有一个__dict__,那么绝对每个班级也会付出拥有一个的代价__dict__,即使他们不需要它。

反而; 子类 get __dict__(和__weakref__,出于类似的原因)除非它们自己定义了__slots__类属性。

为什么你需要一个普通的 ol 实例呢object?你只需要一包属性吗?那么就用一个dict. 如果您确实需要某种具有行为和属性的对象,那么无论如何您都会创建一个子类。

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

BAR_DEFAULT = object()
def foo(bar=BAR_DEFAULT):
    if bar is BAR_DEFAULT:
        #...
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您既不需要也不特别想要 实例上的属性object