|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Sep 2011
Messaggi: 12
|
[python] metaclassi & decoratori
dovrei impostare una metaclasse che aggiunge un decoratore ad un metodo della classe principale.
supponendo che nella classe principale abbia un metodo print_nome creo una metaclasse che fa classdict['print_nome'] = deco, dove deco è il mio decoratore, esatto? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Per queste cose ti conviene utilizzare i più semplici decoratori di classe, piuttosto che ricorrere alle metaclassi.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Sep 2011
Messaggi: 12
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Ho capito. In questo caso ti basta, nella metaclasse, recuperare il metodo voluto dal dizionario dei metodi della classe in oggetto, richiamare il decoratore passandogli il metodo, inserirne il risultato del dizionario precedente.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#5 |
|
Junior Member
Iscritto dal: Sep 2011
Messaggi: 12
|
ho risolto così
Codice:
def deco(func):
print('entro deco')
count=0
def onCall(*args,**kargs):
nonlocal count
count+=1
print('chiamata numero %s' %count)
if count ==3:
return func(*args,**kargs)
return onCall
class Meta(type):
def __new__(cls,classname,super,classdict):
print('cls',cls,'clname',classname,'super',super,'dict',classdict)
classdict['n_eta']=deco(classdict['n_eta'])
return type.__new__(cls,classname,super,classdict)
class Person(metaclass=Meta):
def __init__(self,n,c,e):
self.nome=n
self.cognome=c
self.eta=e
def n_eta(self,a):
self.eta=int(self.eta)+a
return(self.eta)
def __str__(self):
return "il mio nome e' {0} cognome {1} eta' {2} ".format(self.nome,self.cognome,self.eta)
if __name__ == "__main__":
p=Person('tizio','caio','3')
print(p)
p.n_eta(5)
print(p)
p.n_eta(8)
print(p)
p.n_eta(7)
print(p)
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Sì, i decoratori di classe. Personalmente non li ho mai usati, ma la sintassi è identica a quella dei normali decoratori di funzioni/metodi, per cui è decisamente più pulita, elegante e leggibile.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:28.




















