Ilias95 έγραψε:Να συνεχίσω την απορία μου απ' την προηγούμενη σελίδα καθώς βρήκα μια λύση αλλά δεν μπορώ να την χρησιμοποιήσω ακόμα.
Σκέφτηκα να χρησιμοποιήσω την συνάρτηση exec.
Έτσι απ' την κλάση που έδειξα και προηγουμένως:
- Κώδικας: Επιλογή όλων
class Epafes:
global d
d = 1 # Με την μεταβλητή d ορίζω τον αύξων αριθμό μέσα στην __init__.
arithmos_epafwn = 0
def __init__(self, epafi):
global d
print('Εισάγεται στοιχεία της επαφής:\n')
print('Όνομα: ', end='') ; name = input()
print('Επίθετο: ', end='') ; surname = input()
print('e-mail: ', end='') ; mail = input()
print('Διέυθηνση: ', end='') ; address = input()
print('Τηλέφωνο: ', end='') ; telephone = input()
print('Κατηγορία: ', end='') ; category = input()
self.name = name
self.surname = surname
self.mail = mail
self.address = address
self.telephone = telephone
self.category = category
self.k = d # Α/Α - αύξων αριθμός
d += 1
Epafes.arithmos_epafwn += 1
epafi = d
def tell(self):
print('''
{6}. {0} {1}:
Όνομα: {0}
Επίθετο: {1}
e-mail: {2}
Διέυθηνση: {3}
Τηλέφωνο: {4}
Κατηγορία: {5}
'''.format(self.name, self.surname, self.mail, \
self.address, self.telephone, self.category, self.k))
Αν κάνω το παρακάτω και εισάγω Giannis, το πρόγραμμα θα δουλέψει άψογα:
- Κώδικας: Επιλογή όλων
Giannis = Epafes(1)
print('Poia epafi theleis na deis?') ; b = input()
symvolosira = b + '.tell()'
exec(symvolosira) # Η exec μετατρέπει το αλφαριθμητικό a στο όνομα της μεταβλητής στην προκειμένη περίπτωση.
Θα εισάγω δηλαδή τα στοιχεία του Giannis και θα τα πάρω πίσω με την tell().
Αν όμως κάνω μια μικρή αλλαγή και εισάγω και στο a και στο b Giannis, θα έχω πρόβλημα:
- Κώδικας: Επιλογή όλων
print('Pws na onomastei i epafi?') ; a = input()
a = Epafes(1)
print('Poia epafi theleis na deis?') ; b = input()
symvolosira = b + '.tell()'
exec(symvolosira)
Θα πάρω σφάλμα:
- Κώδικας: Επιλογή όλων
Traceback (most recent call last):
File "Epafes.py", line 49, in <module>
exec(symvolosira)
File "<string>", line 1, in <module>
NameError: name 'Ilias' is not defined
(Σκέφτηκα ότι αφού το a θα το ορίσω σαν Giannis και το b πάλι σαν Γιάννης θα δουλέψει, αλλά τελικά το Epafes(1) αντιστοιχίζεται στην μεταβλητή a η οποία πριν απλά είχε την τιμή "Giannis".)
Πως θα το κάνω να καταλάβει ότι το b και το a είναι και τα δύο Giannis;
Ευχαριστώ εκ των προτέρων για οποιαδήποτε απάντηση!
Έχεις λίγο μπερδεμένη έννοια για τα αντικείμενα και της κλάσεις.
Σε μία κλάση περιγράφεις τα όλα τα στοιχεία που προσδιορίζουν ένα αντικείμενο και διάφορες μεθόδους για τον χειρισμό αυτών των στοιχείων.
Στην προκειμένη περίπτωση θέλεις να φτιάξεις μια κλάση που να φτιάχνει αντικείμενα "επαφών". Στην κλάση πρέπει να ορίσεις τι πληροφορίες θέλεις να έχει μια επαφή. Το πως θα εμφανίσεις ή θα καταχωρίσεις νέο αντικείμενο δεν είναι υπόθεση της κλάσης αλλά του προγράμματος.
Δηλαδή:
- Κώδικας: Επιλογή όλων
class epafes(object):
def __init__(self, name=None, address=None, tel=None):
self.name=name
self.address=address
self.tel=tel
Δίνοντας τώρα:
- Κώδικας: Επιλογή όλων
a=epafes("ilias","kapou 35 ellada","768768686")
print a.name, a.address, a.tel
αν γράψεις print a παίρνεις το παρακάτω σαν αποτέλεμα:
- Κώδικας: Επιλογή όλων
print a
<__main__.epafes object at 0xb77fcc8c>
Αυτό αν θέλεις μπορείς να το αλλάξεις αν αλλάξεις την __str__ ή την __repr__ μέθοδο του αντικειμένου.
Στην παραπάνω κλάση προσθεσε την εξής μέθοδο:
- Κώδικας: Επιλογή όλων
def __str__(self):
return "Contact for: %s" % self.name
Για να βάλεις τιμές στο αντικείμενο ή θα το κάνεις την στιγμή που το φτιάχνεις, (όπως παραπάνω epafes("ilias","kapou 35 ellada" .....) ή
θα φτιάξεις πρώτα ένα άδειο αντικείμενο και θα το γεμίσεις με τιμές από τον χρήστη.
- Κώδικας: Επιλογή όλων
a=epafes()
a.name=raw_input("Dwse onoma: ")
a.address=raw_input("Dwse dieuthinsi: ")
a.tel=raw_input("Dwse tel: ")
Τώρα αν θέλεις να δημιουργήσεις πολλά τέτοια αντικείμενα η διαδικασία πρέπει να μπεί σε ένα loop και το κάθε αντικείμενο να σώζεται σε μία λίστα (ή στον δίσκο).
- Κώδικας: Επιλογή όλων
cont='Y'
MyList=[]
while(cont<>'N'):
a=epafes()
a.name=raw_input("Dwse onoma: ")
a.address=raw_input("Dwse dieuthinsi: ")
a.tel=raw_input("Dwse tel: ")
MyList.append(a)
cont=raw_input("Na synexisw? ")
for obj in MyList:
print obj.name, obj.address, obj.tel
και με τον ίδιο τρόπο θα κάνεις την αναζήτηση, βάζοντας σε loop ένα ένα τα αντικείμενα σου και ελέγχοντας αν το όνομα που έγραψε ο χρήστης είναι ίσο με obj.name, αλλιώς στο επόμενο.
Ελπίζω να βοήθησα πάνω στην λογική του προγράμματος
Φιλικά,
Ανδρέας