【问题标题】:Change python object functions更改 python 对象函数
【发布时间】:2016-07-12 02:35:18
【问题描述】:

我在某处看到有一种方法可以更改 python 中的某些对象函数

def decorable(cls):
    cls.__lshift__ = lambda objet, fonction: fonction(objet)
    return cls

我想知道你是否可以在 ruby​​ 中使用 :

number.times

例如,我们可以通过将上面的函数应用于类 int 来实际更改一些预定义的类吗?如果是这样,有什么想法可以做到吗?您能否链接我显示每个可以更改的函数(如 lshift)的 python 文档?

【问题讨论】:

  • python 中的每个函数都可以更改。 (内置类和函数有一些例外,但除此之外,规则成立)
  • 嗯...你什么时候想写x >> func而不是func(x)?你试过了吗?您可以在类构建后的任何时间添加或删除任意属性(或创建前类块中的变量)

标签: python function class object


【解决方案1】:

通常不会 - 通常,在 CPython 中以本机代码定义的 Python 类型不能被猴子修补以具有新方法。尽管有办法通过直接内存访问和更改 C 对象结构来做到这一点,但使用 CPython - 这不被认为是“聪明”、“美丽”,更不可用。 (查看https://github.com/clarete/forbiddenfruit

也就是说,对于您在自己的包中定义的类层次结构,这非常有效 - 任何设置的神奇“dunder”方法都会在整个过程中更改该类的所有对象的行为。

所以,你不能对 Python 的“int”这样做——但你可以有一个

class MyInt(int):
    pass

a = MyInt(10)

MyInt.__rshift__ = lambda self, other: MyInt(str(self) + str(other))

print(a >> 20)

将导致打印1020

介绍该语言使用的所有神奇方法的 Python 文档是数据模型:

https://docs.python.org/3/reference/datamodel.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多