改变python对象的功能

时间:2016-07-12 02:35:19

标签: python function class object

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

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

我想知道你是否可以用红宝石做事:

number.times

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

1 个答案:

答案 0 :(得分:0)

通常不是 - 作为一项规则,在本机代码中定义的Python类型 - 在CPython中不能修补猴子以获得新方法。虽然有办法通过直接内存访问和更改C对象结构来实现这一点,但使用CPython - 不被认为是"聪明","美丽",更不用了。 (查看https://github.com/clarete/forbiddenfruit

也就是说,对于您在自己的包上定义的类层次结构,它几乎可以工作 - 任何魔法" dunder"在所有进程中,set方法会更改该类的所有对象的行为。

所以,你不能对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