【问题标题】:python can't set attributes of built-in/extension type 'object'python无法设置内置/扩展类型'object'的属性
【发布时间】:2014-01-23 21:45:06
【问题描述】:

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

object.lst=lambda o:list(o)

或者

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

全部生成错误消息。 背后有什么设计原因吗?老实说,这很奇怪,因为一切都是对象,你可以随意定义func(obj),所以如果func没有约束参数类型,那为什么方法方式被禁止添加呢? 如果您将 func 作为属性分配给objectobj.func() 正是 func(obj)。既然一切都是对象,那么对象的属性几乎可以定义为一个全局函数。

要不要到处走走?

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

【问题讨论】:

  • @senshin,这个插件确实将属性分配给内部对象,如果你把它放在答案中我可以接受它作为答案。
  • 请随意回答这个问题 - 你比我更清楚你在寻找什么。

标签: python


【解决方案1】:

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

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

函数对象在 2.x 开发周期的某个地方实现了 __dict__ 属性,因此它们可以包含任意属性。

如果您需要一些作为“对象”但具有任意属性的东西,那么您的方法是子类化对象,并在那里添加您的属性:

class MyObj(object): pass

MyObj.lst = lambda o: list(o)

【讨论】:

  • 是的,那么它的返回是一个列表,一个内置类型,你不能给它添加方法(除非你再次覆盖返回到一个子类,这意味着你有很多很多代码要输入) .
猜你喜欢
  • 1970-01-01
  • 2011-10-08
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-17
相关资源
最近更新 更多