2014-01-23 49 views
2

的Python似乎不允许您属性分配给“对象”的内部最高级别:Python不能设置内置/扩展型“对象”的属性

object.lst=lambda o:list(o) 

或者

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

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

无论如何走动?

基本上,如果你有能力添加一些功能的内置类型,你可以做管道风格编程:obj.list().len().range(),我认为这种类型的程序的可读性非常明确,没有任何非pythonic。

+0

参见:http://stackoverflow.com/questions/6738987/extension-method-for-python-built-in-types – senshin

+0

@senshin,这个加载项确实将属性赋值给内部对象,如果你把它放在答案中II可以接受它作为答案。 – NathaneilCapital

+0

请随时自己回答这个问题 - 你知道你在找什么比我更好。 – senshin

回答

5

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

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

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

的路要走,如果你需要的东西,可以作为一个“对象”,但有任意属性是子类的对象,并且有添加属性:

class MyObj(object): pass 

MyObj.lst = lambda o: list(o) 
+0

是的,那么它的返回是一个列表,一个内置类型,你不能添加方法(除非你重新返回到一个子类,这意味着你有许多许多代码键入)。 – NathaneilCapital