Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Abbiamo guidato per diversi giorni la Alpine A290, la prima elettrica del nuovo corso della marca. Non è solo una Renault 5 sotto steroidi, ha una sua identità e vuole farsi guidare
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Abbiamo provato a fondo il nuovo Magic 8 Lite di HONOR, e per farlo siamo volati fino a Marrakech , dove abbiamo testato la resistenza di questo smartphone in ogni condizione possibile ed immaginabile. Il risultato? Uno smartphone praticamente indistruttibile e con un'autonomia davvero ottima. Ma c'è molto altro da sapere su Magic 8 Lite, ve lo raccontiamo in questa recensione completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 22-02-2012, 18:53   #1
postgres
Member
 
Iscritto dal: Apr 2008
Messaggi: 120
[PYTHON] decoratori per permessi agli attributi di una classe

Qualcuno sa come si possa attraverso i decoratori definire permessi di lettura (r), scrittura (w) ed entrambri (rw) agli attributi di una classe?

è un esercizio di università.

Il main è questo:

Codice:
traceMe = False
def trace(*args):
	if traceMe: print('[' + ' '.join(map(str, args)) + ']')
def private(*privates): # privates in enclosing scope
	def onDecorator(aClass): # aClass in enclosing scope
		class onInstance: # wrapped in instance attribute
			def __init__(self, *args, **kargs):
				self.wrapped = aClass(*args, **kargs)
			def __getattr__(self, attr): # My attrs don’t call getattr
				trace('get:', attr) # Others assumed in wrapped
				if attr in privates:
					raise TypeError('private attribute fetch: ' + attr)
				else:
					return getattr(self.wrapped, attr)
			def __setattr__(self, attr, value): # Outside accesses
				trace('set:', attr, value) # Others run normally
				if attr == 'wrapped': # Allow my attrs
					self.__dict__[attr] = value # Avoid looping
				elif attr in privates:
					raise TypeError('private attribute change: ' + attr)
				else:
					setattr(self.wrapped, attr, value) # Wrapped obj attrs
		return onInstance # Or use __dict__
	return onDecorator

from selectors import *
@private('data', 'size', 'label')
@rw(’data’)
@r(’size’)
@w(’label’)
class D:
def __init__(self, label, start):
self.label = label
self.data = start
self.size = len(self.data)
def double(self):
for i in range(self.size):
self.data[i] = self.data[i] * 2
def display(self):
print(’{0} => {1}’.format(self.label, self.data))
if __name__ == "__main__":
X = D(’X is’, [1, 2, 3])
X.display(); X.double(); X.display()
try:
print(X.size)
except Exception as e: print("{0}: {1}".format(type(e).__name__, e))
try:
print(X.data)
except Exception as e: print("{0}: {1}".format(type(e).__name__, e))
print(X.getData())
X.setData([25])
print(X.getSize())
try:
X.setSize(25)
except Exception as e: print("{0}: {1}".format(type(e).__name__, e))
try:
print(X.getLabel())
except Exception as e: print("{0}: {1}".format(type(e).__name__, e))
X.setLabel(’It has worked!!!’)
X.display()
private rende privati gli attributi.

La stampa è questa:

X is
X is => [1, 2, 3]
X is => [2, 4, 6]
TypeError: private attribute fetch: size
TypeError: private attribute fetch: data
[2, 4, 6]
1
Error: setter inexistent: setSize
Error: getter inexistent: getLabel
It has worked!!! => [25]


Forse vanno usati i setattr e i getattr come in private?
Ho provato così ma non funziona:

Codice:
def r(*r): 
	def onDecorator(aClass): 
		class onInstance: 
			def __init__(self, *args, **kargs):
				self.wrapped = aClass(*args, **kargs)
			def getdata(self, attr): 
				#trace('get:', attr) 
				if attr in rw:
					raise TypeError('getter inexistent: getsize: ' + attr)
				else:
					return getattr(self.wrapped, attr)
		return onInstance # Or use __dict__
	return onDecorator
e anche così:

Codice:
traceMe = False
def trace(*args):
	if traceMe: print('[' + ' '.join(map(str, args)) + ']')
def r(*r): # privates in enclosing scope
	def onDecorator(aClass): 
		class onInstance:
			def __init__(self, *args, **kargs):
				self.wrapped = aClass(*args, **kargs)
			def __getattr__(self, attr): 
				trace('get:', attr) 
				if attr in pr:
					raise TypeError('private attribute fetch: ' + attr)
				else:
					return getattr(self.wrapped, attr)
			def __setattr__(self, attr, value): # Outside accesses
				trace('set:', attr, value) # Others run normally
				if attr == 'wrapped': # Allow my attrs
					self.__dict__[attr] = value # Avoid looping
				elif attr in privates:
					raise TypeError('private attribute change: ' + attr)
				else:
					setattr(self.wrapped, attr, value) 
		return onInstance 
	return onDecorator
postgres è offline   Rispondi citando il messaggio o parte di esso
Old 22-02-2012, 19:45   #2
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
L'idea dei decoratori è senz'altro corretta, come pure quella di intercettare i metodi speciali __getattr__ e __setattr__.

Comunque sistema un po' il codice iniziale, perché senza l'indentazione corretta in Python è illeggibile.
__________________
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
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 22-02-2012, 20:04   #3
postgres
Member
 
Iscritto dal: Apr 2008
Messaggi: 120
si scusa è vero non me ne sono accorto. Ecco la seconda parte indentata

Codice:
@private('data', 'size', 'label')
#@rw('data')
@r('size')
#@w('label')

class D:
	def __init__(self, label, start):
		self.label = label
		self.data = start
		self.size = len(self.data)

	def double(self):
		for i in range(self.size):
			self.data[i] = self.data[i] * 2
	def display(self):
		print('{0} => {1}'.format(self.label, self.data))


'''
X is
X is => [1, 2, 3]
X is => [2, 4, 6]
TypeError: private attribute fetch: size
TypeError: private attribute fetch: data
[2, 4, 6]
1
Error: setter inexistent: setSize
Error: getter inexistent: getLabel
It has worked!!! => [25]
'''

if __name__ == "__main__":
	X = D('X is', [1, 2, 3])
	#X.display(); X.double(); X.display()
	try:
		print(X.size)
	except Exception as e: print("{0}: {1}".format(type(e).__name__, e))
	try:
		print(X.data)
	except Exception as e: print("{0}: {1}".format(type(e).__name__, e))
	print(X.getData())
	X.setData([25])
	print(X.getSize())
	try:
		X.setSize(25)
	except Exception as e: print("{0}: {1}".format(type(e).__name__, e))
	try:
		print(X.getLabel())
	except Exception as e: print("{0}: {1}".format(type(e).__name__, e))
	X.setLabel('It has worked!!!')
	X.display()
postgres è offline   Rispondi citando il messaggio o parte di esso
Old 23-02-2012, 08:23   #4
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Questo è un più complicato e mi richiede più tempo per l'analisi del codice e fare qualche prova.

Soltanto un paio di cose:
Codice:
from selectors import *
Questo immagino sia il modulo dove sono memorizzati gli altri 3 decoratori (r, w, rw).

Poi cosa intendi esattamente per attributo "privato"? Uno che sia accessibile soltanto tramite un metodo definito all'interno della classe stessa?

Giusto per essere chiari, supponendo che x sia definito come attributo privato:
Codice:
class c:

  def __init__(self):
    self.x = 'OK'

  def Prova(self):
    print self.x

i = c()

i.Prova() # Stampa OK, perché x è accessibile dall'interno della classe

i.x # Genera un errore, perché non ci si deve poter accedere dall'esterno
__________________
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
cdimauro è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
L'intelligenza artificiale ha reso pi&ug...
L'intelligenza artificiale per lo svilup...
Il sistema di verifica dell'identit&agra...
Ora è ufficiale: Samsung sta per ...
Motorola Edge 70 Fusion: ecco le specifi...
8TB a meno di 170€: il richiestissimo Ha...
Il nuovo MacBook 'low cost' arriver&agra...
Pokémon Rosso Fuoco e Verde Fogli...
Risparmiare con le offerte Amazon: weeke...
Gli Xiaomi 17 arrivano a fine febbraio, ...
48.000 Pa a poco più di 100€: la ...
PC più potente, meno spesa: su Amazon to...
Con 2 acquisti si ottiene il 40% di scon...
Blocco VPN in Spagna durante le partite ...
ECOVACS DEEBOT T30C OMNI GEN2 torna a 34...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 18:51.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v