views:

446

answers:

4

Does Python have extension methods like C#? Is it possible to call a method like:

MyRandomMethod()

on existing types like int?

myInt.MyRandomMethod()
+4  A: 

not sure if that what you're asking but you can extend existing types and then call whatever you like on the new thing:

class  int(int):
     def random_method(self):
           return 4                     # guaranteed to be random
v = int(5)                              # you'll have to instantiate all you variables like this
v.random_method()

class int(int):
    def xkcd(self):
        import antigravity
        print(42)

>>>v.xkcd()
Traceback (most recent call last):
  File "<pyshell#81>", line 1, in <module>
    v.xkcd()
AttributeError: 'int' object has no attribute 'xkcd'
c = int(1)
>>> c.random_method()
4
>>> c.xkcd()
42

hope that clarifies your question

SilentGhost
But I mean calling directly on existing types, not MyInt, but int. So like v = 5; v.RandomMethod();
Joan Venge
you can call class int(int), but you'd need to instantiate variable like: v= int(5)
SilentGhost
Nice XKCD reference.
Evan Fosmark
Thanks. So in effect this class can be written several times with different methods and int will get all of these?
Joan Venge
If you make multiple definitions like this, each one will inherit from the previous one, and so additional methods will accumulate in the most recently-defined "int" class. But the classes defined along the way don't change (tho you lose your reference to them), nor do previously-created instances.
Carl Meyer
NB: this is almost always a bad thing to do in real Python code. Unlike with extension methods in C#, here you are actually making the variable "int" refer to a completely different (inherited) class, which violates the principle of least surprise (i.e. suddenly isinstance(5, int) is False - WTF?)
Carl Meyer
+6  A: 

You can add whatever methods you like on class objects defined in Python code (AKA monkey patching):

>>> class A(object):
>>>     pass


>>> def test(self):
>>>     print self

>>> A.test = stuff
>>> A().test()

This does not work on builtin types, because their __dict__ is not writable (it's a dictproxy).

So no, there is no "real" extension method mechanism in Python.

Torsten Marek
A: 

Another option is to override the meta-class. This allows you to, among other things, specify functions that should exist in all classes.

This article starts to discuss it:

http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html

tsellon
Does this work for builtin types like int?
Roger Pate
I don't think metaclasses give you any way to modify built-in types.
Carl Meyer
That's correct, it can only modify the behavior of classes.
tsellon
+1  A: 

I've had great luck with the method described here:

http://mail.python.org/pipermail/python-dev/2008-January/076194.html

I have no idea if it works on builtins though.

hernan43
Unfortunately, neither method works on built-ins.
ESV