对象类重写或修改

4 投票
3 回答
1836 浏览
提问于 2025-04-15 11:15

有没有办法给一个对象的类添加一个方法,然后让所有这个类的对象都能使用这个方法呢?

3 个回答

0
>>> object.test = "Test"
Traceback (most recent call last):
  File "", line 1, in 
TypeError: can't set attributes of built-in/extension type 'object'

看起来不是这样。(Python 2.5.1)

5

不,Python的内部设计非常注重让内置类型是不可变的,这和Ruby的设计选择完全不同。想要让一个对象可以被“猴子补丁”(也就是动态修改)是很难的,这需要深入修改用C语言写的内部代码,并且还要重新编译Python的运行环境,才能做出一个完全不同的版本(这指的是经典的CPython,但我相信其他一些好的实现,比如Jython和IronPython,原则上也是一样的,只是把C换成Java和C#而已;-)。

8

在Python中,属性是通过字典来实现的:

>>> t = test()
>>> t.__dict__["foo"] = "bla"
>>> t.foo
'bla'

但是对于“对象”,它使用了一个叫做'dictproxy'的东西作为接口,以防止这样的赋值:

>>> object.__dict__["test"] = "test"
TypeError: 'dictproxy' object does not support item assignment

所以不,你是做不到的。

补充说明:你也不能直接修改元类Type。不过因为Python非常灵活,我相信有高手能找到实现你想要的办法。这里有没有什么黑魔法师呢 :-) ?

撰写回答