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()
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()
È 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.
Più tempo utilizzo Python, meglio è! –
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
Ma intendo chiamare direttamente sui tipi esistenti, non su MyInt, ma int. Quindi, come v = 5; v.RandomMethod(); –
puoi chiamare class int (int), ma dovrai istanziare una variabile come: v = int (5) – SilentGhost
Nice XKCD reference. –
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
Funziona per tipi incorporati come int? –
Non penso che le metaclassi ti forniscano alcun modo per modificare i tipi predefiniti. –
Questo è corretto, può solo modificare il comportamento delle classi. – tsellon
che ho avuto grande fortuna con il metodo descritto qui:
http://mail.python.org/pipermail/python-dev/2008-January/076194.html
Non ho idea se funziona su builtins anche se.
Sfortunatamente, nessuno dei due metodi funziona sui built-in. – ESV
suona come "patching scimmia" – hop