|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 5823
|
[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 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" 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"" Codice:
from Animali import * 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 Codice:
'module' object is not callable Ultima modifica di Unrue : 04-01-2010 alle 15:37. |
![]() |
![]() |
![]() |
#2 |
Senior Member
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. |
![]() |
![]() |
![]() |
#3 |
Senior Member
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() 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! |
![]() |
![]() |
![]() |
#4 |
Senior Member
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. |
![]() |
![]() |
![]() |
#5 |
Senior Member
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! |
![]() |
![]() |
![]() |
#6 |
Senior Member
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. |
![]() |
![]() |
![]() |
#7 |
Senior Member
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 |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
|
Non hai mai usato moduli??? E come mai?
![]() |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 5823
|
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 Animali: Codice:
__all__ = ["Animale", "Cane","Gatto"] Codice:
__all__ = ["animale"] Codice:
__all__ = ["cane"] 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'], ) ![]() Ultima modifica di Unrue : 05-01-2010 alle 10:59. |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
|
Il setup.py non serve. Prova a mettere tutti gli __init__.py vuoti.
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 5823
|
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
|
Molto strano. Adesso sto uscendo, stasera vediamo di risolvere.
|
![]() |
![]() |
![]() |
#13 |
Senior Member
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() 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.
__________________
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 |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Nov 2002
Messaggi: 5823
|
Caro cdimauro, grazie infinite per le tue risposte sempre molto esaurienti, adesso ho capito
![]() |
![]() |
![]() |
![]() |
#15 |
Senior Member
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.
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:02.