2009-02-05 7 views
31

Python ha metodi di estensione come C#? E 'possibile chiamare un metodo simile:Metodi di estensione in Python

MyRandomMethod() 

sui tipi esistenti, come int?

myInt.MyRandomMethod() 
+1

suona come "patching scimmia" – hop

risposta

39

È puoi aggiungere qualsiasi metodo tu voglia sugli oggetti di classe definiti in codice Python (patching patch AKA):

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


>>> def stuff(self): 
>>>  print self 

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

Questo non funziona sui tipi builtin, perché il loro __dict__ non è scrivibile (è un dictproxy).

Quindi no, non esiste un meccanismo di metodo di estensione "reale" in Python.

+3

Più tempo utilizzo Python, meglio è! –

7

non sono sicuro che quello che stai chiedendo, ma è possibile estendere i tipi esistenti e quindi chiamare quello che vuoi sul cosa nuova:

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 

speranza che chiarisce la tua domanda

+0

Ma intendo chiamare direttamente sui tipi esistenti, non su MyInt, ma int. Quindi, come v = 5; v.RandomMethod(); –

+0

puoi chiamare class int (int), ma dovrai istanziare una variabile come: v = int (5) – SilentGhost

+3

Nice XKCD reference. –

0

Un'altra opzione è sovrascrivere la meta-classe. Ciò consente, tra le altre cose, di specificare le funzioni che dovrebbero esistere in tutte le classi.

Questo articolo inizia a discuterne:

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

+0

Funziona per tipi incorporati come int? –

+1

Non penso che le metaclassi ti forniscano alcun modo per modificare i tipi predefiniti. –

+0

Questo è corretto, può solo modificare il comportamento delle classi. – tsellon