python无法设置内置/扩展类型'对象'的属性

时间:2014-01-23 21:45:07

标签: python

Python似乎不允许您将属性分配给内部最高级别的“对象”:

object.lst=lambda o:list(o)

或者

func=lambda o:list(o)
setattr(object,'lst',func)

全部生成错误消息。 它背后的任何设计理由?老实说,这很奇怪,因为一切都是对象,你可以根据需要定义func(obj),所以如果func不是约束参数类型,为什么禁止添加方法呢? 如果将func作为属性分配给obj.func(),则object正好是func(obj)。由于一切都是对象,因此对象的属性几乎是定义的全局函数。

无论如何要走动?

基本上,如果你有能力为内置类型添加一些函数,你可以进行管道样式编程:obj.list().len().range()我认为这种类型程序的可读性非常清晰,没有任何非pythonic。 / p>

1 个答案:

答案 0 :(得分:6)

我目前还不确定实际的“设计”推理,尽管有 - 但事实是该对象,因为其他一些内置类是用本机代码编写的(称为“内置”) ) -

由于这些内置类的性质(它们的代码通常在C中),它们本身没有__dict__属性,因此不允许任意参数设置。

函数对象在2.x开发周期的某处实现了__dict__属性,因此它们可以保存任意属性。

如果你需要一些作为“对象”但具有任意属性的东西,那就是继承对象,并在那里添加你的属性:

class MyObj(object): pass

MyObj.lst = lambda o: list(o)