Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6
Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6
In occasione del proprio Snapdragon Summit Qualcomm annuncia i due nuovi chip per dispositivi mobile di fascia alta che entreranno nel mercato nel corso del 2027: tanta potenza a disposizione per elaborazioni di intelligenza artificiale sempre più complesse
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole!
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole!
Hogwarts arriva in fascia media grazie a realme, con una special edition che unisce la Quadra Light-Sensing Color-changing Tech, un baule in stile Hogwarts Express pieno di collezionabili e una scheda tecnica sostanzialmente identica al 16 Pro di partenza: ecco cosa cambia davvero, come si comporta nell'uso quotidiano e quanto vale in base al prezzo di 699,99 euro
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
REDMI Note 17 Pro porta in fascia media una batteria da 8.340 mAh con ricarica HyperCharge a 67W, un display AMOLED da 6,83 pollici capace di picchi di luminosità molto elevati e una struttura certificata TÜV SÜD contro cadute e infiltrazioni d'acqua, il tutto racchiuso in una scocca da 223 grammi. Lo abbiamo provato per diversi giorni tra fotocamera, prestazioni, autonomia e prezzo sul mercato italiano
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 04-01-2010, 15:25   #1
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7404
[Python] Problema con i packages

Ciao a tutti,
sto cercando di scrivere un piccolo esempio di ereditarietà in Python utilizzando moduli e packages.

Al momento ho una dir Animale, che ha al suo interno le dir Animali, Cane, Gatto. Animali quindi è la superclasse di Cane e Gatto.Ho il file __init__.py in tutti i rami di tali dir e in quella principale.

All'interno di Animali ho animale.py:

Codice:
class Animale:
   def __init__(self, nome, razza):
	self.nome = nome
	self.razza = razza

   def visualizza(self):
	print self.nome
	print self.razza
Questa è cane.py:

Codice:
class Cane(Animale):
    def __init(self, nome, razza, verso):
	Animale.__init__(nome, razza)
	self.verso = verso

    def visualizza(self):
        Animale.visualizza(self)
	print self.verso
        print "Sono un cane"
Infine questa è gatto.py:

Codice:
class Gatto(Animale):
    def __init(self, nome, razza, verso):
	Animale.__init__(nome, razza)
	self.verso = verso

    def visualizza(self):
        Animale.visualizza(self)
	print self.verso
        print "Sono un gatto""
Ora, dopo aver definito il percorse del package nella variabile di ambiente PYTHONPATH ed aver scritto:

Codice:
from Animali import *
alla creazione di un oggetto Animale mi viene detto:

a= Animale("b","c")
name 'Animale' is not defined

E' chiaro che sbaglio qualcosa nell'indicare i moduli, ma allora perché non dà errori quando scrivo i comandi di import?

Se invece scrivo:

Codice:
from Animali import Animale
l'errore è :

Codice:
'module' object is not callable
Quindi non si riferisce alla classe ma al nome del modulo.

Ultima modifica di Unrue : 04-01-2010 alle 15:37.
Unrue è online   Rispondi citando il messaggio o parte di esso
Old 04-01-2010, 20:59   #2
Ryuzaki_Eru
Senior Member
 
L'Avatar di Ryuzaki_Eru
 
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
Non ho letto il post perchè sto uscendo, ma dal titolo la prima cosa che posso dirti è:

controlla di non aver dato ai moduli nomi "proibiti"
hai messo i vari __init__.py nelle cartelle?

Se puoi scrivere precisamente la gerarchia delle cartelle sarebbe più facile aiutarti.

Ciao.
Ryuzaki_Eru è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2010, 21:00   #3
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Mi sa che stai creando un package, non un modulo. Non me ne intendo molto di moduli personalizzati, ma direi che debbano risiedere tutti nella stessa directory se vuoi evitarti l'installazione manuale del package (se vuoi comunque farla, vedi qui: http://docs.python.org/distutils/exa...ion-by-module).

Ad esempio, mettiamo che il tuo progetto si componga di un file principale "__main__.py" e che richieda le tre classi "Animale", "Cane" e "Gatto"; allora vorrai fare probabilmente:

Codice:
#!/usr/bin/python
# -*- coding: utf-8 -*-

from Animali import *

if __name__ == "__main__":
    c = Cane()
    g = Gatto()

    c.visualizza()
    g.visualizza()
A quel punto credo che dovresti mettere le tre classi "Animale", "Cane" e "Gatto" in un unico file "Animali.py" che importi dal codice precedente con la direttiva from.

O magari sto dicendo una cagata.
Spero di essermi reso utile, e non di averti fuorviato.

ciao
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2010, 21:04   #4
Ryuzaki_Eru
Senior Member
 
L'Avatar di Ryuzaki_Eru
 
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
I package in Python si possono creare tranquillamente e importare da essi senza problemi. Il problema è da qualche altra parte. Quando torno guardo, mentre magari qualcuno ti aiuta.
Ora scappo davvero.
Ryuzaki_Eru è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2010, 21:07   #5
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Lo so che si possono fare, ma non avendo mai avuto modo di farlo non posso dire se sta sbagliando procedura o meno. Credo tuttavia che gli basti un modulo.

Ho solo cercato di dare un piccolo contributo, ma magari ho detto baggianate.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2010, 21:12   #6
Ryuzaki_Eru
Senior Member
 
L'Avatar di Ryuzaki_Eru
 
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
Stasera non è proprio destino uscire
Allora, nel suo caso ovviamente può fare tutto in un modulo, ma visto che vuole imparare come organizzare i package e importare da essi è un buon esercizio.
Per creare un package la cosa principale è non dare nomi alle cartelle o ai moduli già esistenti e inserire un file __init__.py in ogni cartella.
Da come ha scritto sembra che ha fatto tutto bene, ma è chiaro che qualcosa non c'è.

Posta un attimo il package che gli dò un'occhiata.
Ryuzaki_Eru è offline   Rispondi citando il messaggio o parte di esso
Old 05-01-2010, 06:09   #7
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Al momento ho pochissimo tempo (in particolare a causa dell'ultimo articolo che ho scritto ).

Velocemente:
- serve creare un file __init__.py per ogni cartella;
- ogni file __init__.py si deve occupare di importare o mettere a disposizione (con l'uso di __all__ se si vogliono esportare soltanto dei precisi simboli / identificatori) la roba delle sottocartelle & moduli di livello inferiore che devono essere resi visibili al livello superiore.

Non ho mai usato moduli, e non ho perso tempo a documentarmi più di tanto. Stasera, se ho tempo, mi rileggo un po' di roba e vedo se ho scritto delle boiate oppure no.
__________________
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 05-01-2010, 10:44   #8
Ryuzaki_Eru
Senior Member
 
L'Avatar di Ryuzaki_Eru
 
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
Non hai mai usato moduli??? E come mai?
Ryuzaki_Eru è offline   Rispondi citando il messaggio o parte di esso
Old 05-01-2010, 10:57   #9
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7404
Allora inanzituto grazie per le risposte. Dunque, riepilogo la situazione. Questa è la gerarchia delle cartelle:

Codice:
Animali --> __init__.py
            -->  Animale ---> __init__.py, animale.py
            -->  Cane      --> __init__.py, cane.py
            -->  Gatto     -->  __init__.py, gatto.py
Questi sono i vari __init__.py:

Animali:
Codice:
__all__ = ["Animale", "Cane","Gatto"]
Animale:
Codice:
__all__ = ["animale"]
Cane:
Codice:
__all__ = ["cane"]
Gatto:
Codice:
__all__ = ["gatto"]

Il codice degli altri *.py è postato all'inizio del thread. Ho provato anche successivamente a scrivere il setup.py nella cartella Animali:

Codice:
from distutils.core import setup
setup(name='foobar',
      version='1.0',
      packages=['Animale', 'Cane', 'Gatto'],
      )
Ma non ha funzionato

Ultima modifica di Unrue : 05-01-2010 alle 10:59.
Unrue è online   Rispondi citando il messaggio o parte di esso
Old 05-01-2010, 11:00   #10
Ryuzaki_Eru
Senior Member
 
L'Avatar di Ryuzaki_Eru
 
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
Il setup.py non serve. Prova a mettere tutti gli __init__.py vuoti.
Ryuzaki_Eru è offline   Rispondi citando il messaggio o parte di esso
Old 05-01-2010, 11:04   #11
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7404
Quote:
Originariamente inviato da Ryuzaki_Eru Guarda i messaggi
Il setup.py non serve. Prova a mettere tutti gli __init__.py vuoti.
Niente, riporta questo errore:


Codice:
from Animali import *
a = Cane("c","d","e")
name 'Cane' is not defined
Unrue è online   Rispondi citando il messaggio o parte di esso
Old 05-01-2010, 11:11   #12
Ryuzaki_Eru
Senior Member
 
L'Avatar di Ryuzaki_Eru
 
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
Molto strano. Adesso sto uscendo, stasera vediamo di risolvere.
Ryuzaki_Eru è offline   Rispondi citando il messaggio o parte di esso
Old 06-01-2010, 06:46   #13
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Rieccomi. Scusatemi, ma ieri sera mi sono addormentato prima di mio figlio.

In allegato trovate un file che racchiude la giusta gerarchia. Di seguito un esempio che lo utilizza:
Codice:
import sys
sys.path.append('./Animali')

from Animale.animale import Animale
a = Animale('pitone', 'serpente')
a.visualizza()

from Cane.cane import Cane
c = Cane('ciwawa', 'rompiscatole', 'bau bau')
c.visualizza()

from Gatto.gatto import Gatto
g = Gatto('persiano', 'mangione', 'miao miao')
g.visualizza()
e alcune puntualizzazioni.

In primis bisogna capire bene la gararchia su filesystem, dalla quale dipende la visibilità di ogni modulo e package.

Chiaramente è fondamentale che almeno la cartella principale che contiene l'intero package sia raggiungibile, e questo è garantito dal sys.path.append('./Animali') che trovate nell'esempio.

Questo comporta che sia il file __init__.py sia raggiungibile da filesystem, che tutte le altre cartelle e file in esso contenuti.

Attenzione anche all'uso dei nomi dei file. Python è un linguaggio case sensitive per gli identificatori (purtroppo), per cui cane.py e Cane.py sono due file distinti, e nel codice che ne fa uso va utilizzato "from cane" nel primo caso e "from Cane" nel secondo.

Per il resto e come potete vedere dai sorgenti, si tratta semplicemente di capire qual è la posizione iniziale su filesystem, e quella (relativa) di ogni singolo modulo. Fatto questo, diventa tutto molto più semplice.

Per qualsiasi dubbio sono a disposizione.

P.S. C'erano degli errori di sintassi che ho provveduto a correggere.
Allegati
File Type: zip Animali.zip (4.0 KB, 10 visite)
__________________
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 06-01-2010, 11:23   #14
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 7404
Caro cdimauro, grazie infinite per le tue risposte sempre molto esaurienti, adesso ho capito
Unrue è online   Rispondi citando il messaggio o parte di esso
Old 06-01-2010, 13:16   #15
Ryuzaki_Eru
Senior Member
 
L'Avatar di Ryuzaki_Eru
 
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
Aggiungerei che il problema del path dipende se vuoi importare il package da una posizione diversa rispetto a dove ti trovi al momento.
Ryuzaki_Eru è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6 Qualcomm annuncia la nuova generazione di SoC Sn...
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole! realme 16 Pro Harry Potter Edition: il nuovo mid...
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce Recensione REDMI Note 17 Pro: il midrange con ba...
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
ASUS ROG Azoth 96 HE: con gli switch mag...
Tutte le offerte Amazon aggiornate: sono...
DeepSeek punta sempre di più sui ...
Apple rilascia le prime beta pubbliche d...
La Terra di Mezzo: L'Ombra di Mordor e L...
iPhone 18 Pro e Pro Max smontati da iFix...
Control Resonant supera i 2 milioni di w...
Anker porta in Italia gli auricolari ope...
Googlebook, preordini aperti per i primi...
MSI Pro Max Edge AI+: fino a 96 GB di me...
Trump propone di cambiare il nome dell'i...
Sennheiser MOMENTUM 5 a 299€ invece di 3...
Il prossimo Halo sarà sviluppato ...
Philips Sonicare contro Oral-B iO: spazz...
DJI Osmo Action 4 Combo Essential a 194€...
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: 12:11.


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