A generic function viene inviato in base al tipo di tutti i suoi argomenti. Il programmatore definisce diverse implementazioni di una funzione. Quello corretto viene scelto al momento della chiamata in base al tipo dei suoi argomenti. Questo è utile per l'adattamento dell'oggetto tra le altre cose. Python ha alcune funzioni generiche tra cui len()
.Qual è l'implementazione delle funzioni generiche meglio gestite per Python?
Questi pacchetti tendono a consentire il codice che assomiglia a questo:
@when(int)
def dumbexample(a):
return a * 2
@when(list)
def dumbexample(a):
return [("%s" % i) for i in a]
dumbexample(1) # calls first implementation
dumbexample([1,2,3]) # calls second implementation
Un esempio meno stupido Ho pensato ultimamente sarebbe un componente Web che richiede un utente. Invece di richiedere un particolare framework web, l'integratore avrebbe solo bisogno di scrivere qualcosa di simile:
class WebComponentUserAdapter(object):
def __init__(self, guest):
self.guest = guest
def canDoSomething(self):
return guest.member_of("something_group")
@when(my.webframework.User)
componentNeedsAUser(user):
return WebComponentUserAdapter(user)
Python ha alcune funzioni generiche implementazioni. Perché dovrei sceglierne uno rispetto agli altri? Come viene utilizzata questa implementazione nelle applicazioni?
Ho familiarità con Zope zope.component.queryAdapter(object, ISomething)
. Il programmatore registra un adattatore richiamabile che accetta una determinata classe di oggetti come argomento e restituisce qualcosa compatibile con l'interfaccia. È un modo utile per consentire i plugin. A differenza delle patch delle scimmie, funziona anche se un oggetto deve adattarsi a più interfacce con gli stessi nomi di metodo.
La funzione 'len' chiama semplicemente il metodo' __len__' di un oggetto. È questo che intendi per funzione "generica"? Se è così, ci sono relativamente poche funzioni che si comportano così. Hai qualcos'altro in mente? Se è così, per favore scegli un esempio migliore. –
Stai parlando di polimorfismo? O stai parlando di tipi esistenti di patch delle scimmie per aggiungere il polimorfismo? –
sembra (basato sul collegamento "e wikipedia fornito") joeforker sta cercando di implementare funzioni sovraccariche. Credo che si riferisca a "generico" nel senso che la funzione è chiamata da 1 nome ma esegue codice diverso in base ai parametri passati. Così: my_function (a) -> execute function_a my_function (b) -> execute function_b E 'un più elegante implementazione di analizzare i ** kwargs per ottenere che il codice da eseguire – Mark