代码之家  ›  专栏  ›  技术社区  ›  scherand

` setattr`在'dict'的子类上工作,但不直接在'dict'上工作[重复]

  •  0
  • scherand  · 技术社区  · 7 年前

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

    object.lst=lambda o:list(o)
    

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

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

    不管怎样,到处走走?

    基本上,如果您能够为内置类型添加一些函数,则可以执行管道样式编程: obj.list().len().range() 我认为这类程序的可读性非常清楚,没有非蟒蛇的。

    0 回复  |  直到 9 年前
        1
  •  6
  •   101    9 年前

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

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

    函数对象具有 _口述__ 属性在2.x开发周期的某个地方实现,因此它们可以保存任意属性。

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

    class MyObj(object): pass
    
    MyObj.lst = lambda o: list(o)