繁体   English   中英

Python语言问题:object()与Function的属性

[英]Python Language Question: attributes of object() vs Function

在python中,为这样的对象实例创建新属性是非法的

>>> a = object()
>>> a.hhh = 1

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'hhh'

但是,对于一个函数对象,它是可以的。

>>> def f():
...   return 1
...
>>> f.hhh = 1

这种差异背后的理由是什么?

函数对象支持任意属性的原因是,在我们添加该特性之前,几个框架(例如解析器生成器)滥用函数文档字符串(以及函数对象的其他属性)来隐藏对它们至关重要的每个函数信息 - 需要将任意命名属性关联到函数对象,这些函数对象通过示例得到证明,直接用语言支持它们而不是踢出并让(例如)文档字符串被滥用,这是非常明显的。

为了支持任意实例的属性类型必须提供其实例的每一个有__dict__ -这不是什么大不了的功能(这是从来没有微小物体反正),但它很可能是在微小的其他对象。 通过使object类型尽可能轻,并提供__slots__以允许在object子类型中避免每个实例__dict__ ,我们尽最大努力支持小的,专门的“值”类型。

Alex Martelli发表了一个很棒的答案。 对于正在寻找在空对象上完成任意属性的好方法的任何人,请执行以下操作:

class myobject(object):
    pass

o = myobject()
o.anything = 123

如果你知道属性,或者更有效(并且更好地记录):

class myobject(object):
    __slots__ = ('anything', 'anythingelse')

o = myobject()
o.anything = 123
o.anythingelse = 456

理由是object()一个实例是一个退化的特例。 它“是”一个对象,但它本身并不是有用的。

object视为临时hack,桥接旧式类型和类。 在Python 3.0中,它将逐渐消失,因为它将不再被用作一部分

class Foo( object ):
    pass

f = Foo()
f.randomAttribute = 3.1415926

这是另一种替代方案,尽可能简短:

>>> dummy = type('', (), {})()
>>> dummy.foo = 5
>>> dummy.foo
5

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM