4

Is it possible to add a method to an object class, and use it on all objects?

Greg
  • 9,068
  • 6
  • 49
  • 91
Igor Golodnitsky
  • 4,456
  • 7
  • 44
  • 67

3 Answers3

8

In Python attributes are implemented using a dictionary :

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

But for "object", it uses a 'dictproxy' as an interface to prevent such assignement :

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

So no, you can't.

NB : you can't modify the metaclass Type directly neither. But as Python is very flexible, I am sure a Guru could find a way to achieve what you want. Any black wizard around here :-) ?

Bite code
  • 578,959
  • 113
  • 301
  • 329
  • 4
    No, metaclasses will only affect classes and objects that use them, not existing built-in types such as object, int, str, float, and so on. So, "all objects" is just not going to happen. (You can stick new functions into __builtin__ of course, which will make them just as widely available, but they're not going to be METHODS of the object built-in type). – Alex Martelli Apr 26 '09 at 16:09
5

No, Python's internals take great care to make built-in types NOT mutable -- very different design choices from Ruby's. It's not possible to make object "monkeypatchable" without deeply messing with the C-coded internals and recompiling the Python runtime to make a very different version (this is for the classic CPython, but I believe exactly the same principle holds for other good implementations such as Jython and IronPython, just s/C/Java/ and S/C/C#/ respectively;-).

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

Doesn't look like it. (Python 2.5.1)

Georg Schölly
  • 124,188
  • 49
  • 220
  • 267