Μάθημα 5 - Μελέτη κώδικα Αντικειμενοστρεφής προγραμματισμός

...ασύγχρονα μαθήματα python

Μάθημα 5 - Μελέτη κώδικα Αντικειμενοστρεφής προγραμματισμός

Δημοσίευσηαπό sokoban4ever » 03 Αύγ 2009, 00:42

    Συνεχίζουμε ακάθεκτοι μέσα στην καρδιά του καλοκαιριού την Python
    Αυτή την φορά θα δούμε παραδείγματα από κώδικα για την κατανόηση και λύση ενός προβλήματος με
    διάφορες προσεγγίσεις .
    Τέλος μια αναλυτικότερη αναφορά στον αντικειμενοστραφή προγραμματισμό με την Python
    θα μας εκθέσει τις δυνατότητες εκείνες που την καθιστούν μια object oriented γλώσσα .
Ορίστε και η ύλη από το γνωστό βιβλίο :D :

Επίλυση προβλημάτων


http://www.swaroopch.com/notes/Python_el:%CE%95%CF%80%CE%AF%CE%BB%CF%85%CF%83%CE%B7_%CF%80%CF%81%CE%BF%CE%B2%CE%BB%CE%B7%CE%BC%CE%AC%CF%84%CF%89%CE%BD

Αντικειμενοστρεφής προγραμματισμός


http://www.swaroopch.com/notes/Python_el:%CE%91%CE%BD%CF%84%CE%B9%CE%BA%CE%B5%CE%B9%CE%BC%CE%B5%CE%BD%CE%BF%CF%83%CF%84%CF%81%CE%B5%CF%86%CE%AE%CF%82_%CF%80%CF%81%CE%BF%CE%B3%CF%81%CE%B1%CE%BC%CE%BC%CE%B1%CF%84%CE%B9%CF%83%CE%BC%CF%8C%CF%82

Καλό διάβασμα για αυτή την εβδομάδα :P
Σημείωση:
Είτε στις διακοπές σε κάποια παραλία είτε μετά από την δουλειά κουρασμένοι στο σπίτι
η Python ανταμείβει με την μοναδική αναλογία δυνατοτήτων και ευκολίας που παρέχει
Keep on dudes ;) :thumbup:
Θέλουμε και μπορούμε να έχουμε μια καλύτερη ζωή και όσο θα ζούμε θα προσπαθούμε να την αποκτήσουμε ακόμα και αν πεθάνουμε προσπαθώντας, και αν κάποια στιγμή λιγίσουμε έχουμε το επίπεδο να πούμε κουράστηκα λίγο να ,να ξαποστάσουμε , ώστε να συνεχίσουμε πάλι δυνατοί ξανά.

Μήνυμα με αγάπη και αληλλεγγύη σε όλους τους ανθρώπους από όλους τους λαούς , ιδίως του Ελληνικού.
Άβαταρ μέλους
sokoban4ever
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 2331
Εγγραφή: 13 Φεβ 2009, 02:22
Εκτύπωση

Re: Μάθημα 5 - Μελέτη κώδικα Αντικειμενοστρεφής προγραμματισμός

Δημοσίευσηαπό atermon » 03 Αύγ 2009, 02:29

Spoiler: show
Οφείλω ASAP κάποιες διορθώσεις στα κεφάλαια προς μελέτη (συντακτικά και γραμματικά κυρίως). ;)
<Οδηγίες προς νεοεισερχόμενους> | <Οδηγοί χρήσης>
DEBIAN "Sid" 32bit σε Sony VAIO VGN-FE11S
Intel T2400(1,83 GHz) │ 2GB DDR2 │ NVIDIA GeForce Go 7400 │Intel 3945ABG │Intel 82801G(ICH7 Family) │ TFT 15.4" WXGA
Άβαταρ μέλους
atermon
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 711
Εγγραφή: 13 Μάιος 2008, 20:31
Εκτύπωση

Re: Μάθημα 5 - Μελέτη κώδικα Αντικειμενοστρεφής προγραμματισμός

Δημοσίευσηαπό malos » 06 Οκτ 2009, 10:46

Όταν δίνω pyuic4 arxeio.ui > arxeio.py μου φτιάχνει μια χαρά τον κώδικα σε python (στο αρχείο.py).
Εκεί μέσα παρατηρώ την μέθοδο __init__ και από κάτω είναι πλακωμένο στην self.

O Swaroop μας είπε λίγο γι αυτά ! (Να ναι καλά το παληκάρι :D ). http://www.swaroopch.com/notes/Python_e ... F%8C%CF%82

Μήπως μπορούμε να πούμε κάτι περισσότερο εδώ ;
Να το κάνουμε ακόμα πιο κατανοητό;

Δηλαδή έχω σκόρπια κάποια πράγματα ( και συναισθήματα :lol: ) σχετικά με την init και την self.

1. Όταν λέει "Η μέθοδος __init__ εκτελείται μόλις ένα αντικείμενο μιας κλάσης αρχικοποιείται." τι εννοεί ;
Το a = 5 π.χ. δεν είναι μια αρχικοποίηση του a , αν το βάλουμε στην αρχή του κώδικα ( και μετά μπορεί να αλλάξει η τιμή φαντάζομαι ).
Ποιο το όφελος με την init ;

2. Τη self πρέπει να τη βάζουμε πάντα όταν στήνουμε μία κλάση ;

3 στον κώδικα

Κώδικας: Επιλογή όλων
class Person:
    def __init__(self, name):
        self.name = name
    def sayHi(self):
        print('Hello, my name is', self.name)

p = Person('Swaroop')
p.sayHi()


λέει ότι "Τώρα, δημιουργούμε ένα νέο πεδίο που αποκαλείται επίσης name. Προσέξτε ότι πρόκειται για δύο διαφορετικές μεταβλητές παρότι αναφέρονται και οι δύο ως 'name'. Δεν πρόκειται να υπάρξει σύγχιση εδώ διότι ο διάστικτος συμβολισμός (dotted notation) self.name σημαίνει ότι υπάρχει που λέγεται "name" και είναι μέρος του αντικειμένου που λέγεται "self" ενώ το άλλο name είναι μια τοπική μεταβλητή.

μπορεί κάποιος να αντικαταστήσει το ένα name με τη λέξη onoma ώστε να γίνει κατανοητός ο διαχωρισμός αυτός. Εγώ χάθηκα :crazy:

Και γενικά μπορούμε να τα συζητήσουμε αυτά λίγο.

Ευχαριστώ :)
Επεξεργαστής: AMD Ryzen 9 5900x
Μνήμη Gskill 16gb (2X8gb), 3200 mh, CL 14
Μητρική: Asrock X570 phantom gaming X
Τροφοδοτικό: Corsair 850 platinum
Δίσκος: SSD Corsair MP600 (1 TB)
Άβαταρ μέλους
malos
saintTUX
saintTUX
 
Δημοσιεύσεις: 1222
Εγγραφή: 02 Νοέμ 2008, 12:00
Εκτύπωση

Re: Μάθημα 5 - Μελέτη κώδικα Αντικειμενοστρεφής προγραμματισμός

Δημοσίευσηαπό Luke » 06 Οκτ 2009, 12:37

malos έγραψε:3 στον κώδικα

Κώδικας: Επιλογή όλων
class Person:
    def __init__(self, name):
        self.name = name
    def sayHi(self):
        print('Hello, my name is', self.name)

p = Person('Swaroop')
p.sayHi()


λέει ότι "Τώρα, δημιουργούμε ένα νέο πεδίο που αποκαλείται επίσης name. Προσέξτε ότι πρόκειται για δύο διαφορετικές μεταβλητές παρότι αναφέρονται και οι δύο ως 'name'. Δεν πρόκειται να υπάρξει σύγχιση εδώ διότι ο διάστικτος συμβολισμός (dotted notation) self.name σημαίνει ότι υπάρχει που λέγεται "name" και είναι μέρος του αντικειμένου που λέγεται "self" ενώ το άλλο name είναι μια τοπική μεταβλητή.

μπορεί κάποιος να αντικαταστήσει το ένα name με τη λέξη onoma ώστε να γίνει κατανοητός ο διαχωρισμός αυτός.

Σωστά και ίσως είναι προτιμότερο μερικές φορές. Αλλά πολλές φορές δε θες να μπλέκεις με πολλά ονόματα μεταβλητών, τα οποία ενδεχομένως θα πρέπει να θυμάσαι προκειμένου να κάνεις γρήγορα τη δουλειά σου, οπότε η χρήση του self σου λύνει τα χέρια σε αυτές τις περιπτώσεις.
1 Γνώσεις ⇛ Linux: Χαμηλό προς Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
2 Λειτουργικά → Ubuntu 10.04 lucid 64bit (en_US.utf8), Windows 7
3 Προδιαγραφές → Intel Core i5-2500 CPU @ 3.30GHz ‖ RAM 7916 MiB ‖ MSI H67MA-E35 (MS-7680) - MSI MS-7680
4 Κάρτες γραφικών: Intel Sandy Bridge Integrated Graphics Controller [8086:0102] (rev 09)
5 Δίκτυα: eth0: Realtek RTL8111/8168B PCI Express Gigabit Ethernet controller [10ec:8168] (rev 06)
Άβαταρ μέλους
Luke
babeTUX
babeTUX
 
Δημοσιεύσεις: 91
Εγγραφή: 23 Μάιος 2009, 21:31
Εκτύπωση

Re: Μάθημα 5 - Μελέτη κώδικα Αντικειμενοστρεφής προγραμματισμός

Δημοσίευσηαπό malos » 06 Οκτ 2009, 20:59

δηλαδή πως σου λύνει τα χέρια ;

Και στον παραπάνω κώδικα ποιο name είναι ποιο ; Μπορείς να βάλεις το άλλο με κάποιο άλλο όνομα;
Δηλαδή για να καταλάβω

έτσι είναι σωστό
Κώδικας: Επιλογή όλων
class Person:
    def __init__(self, onoma):
        self.onoma = name
    def sayHi(self):
        print('Hello, my name is', self.onoma)

p = Person('Swaroop')
p.sayHi()


ή έτσι ;

Κώδικας: Επιλογή όλων
class Person:
    def __init__(self, name):
        self.name = onoma
    def sayHi(self):
        print('Hello, my name is', self.name)

p = Person('Swaroop')
p.sayHi()
Επεξεργαστής: AMD Ryzen 9 5900x
Μνήμη Gskill 16gb (2X8gb), 3200 mh, CL 14
Μητρική: Asrock X570 phantom gaming X
Τροφοδοτικό: Corsair 850 platinum
Δίσκος: SSD Corsair MP600 (1 TB)
Άβαταρ μέλους
malos
saintTUX
saintTUX
 
Δημοσιεύσεις: 1222
Εγγραφή: 02 Νοέμ 2008, 12:00
Εκτύπωση

Re: Μάθημα 5 - Μελέτη κώδικα Αντικειμενοστρεφής προγραμματισμός

Δημοσίευσηαπό sokoban4ever » 07 Οκτ 2009, 01:14

@malos
και στις δυο περιπτώσεις θα σου βγάλει NameError
είτε
NameError: global name 'name' is not defined
είτε
NameError: global name 'onoma' is not defined

Στο function definition --> def __init__(self,name):
το name είναι ένα argument (και παρεμπιπτόντως positional argument) απλά για να μεταφέρει στο εσωτερικό της __init__ την μεταβλητή
όπως και να λέγεται αυτή .

Όταν κάνεις self.κάτι
δεν έχει σημασία πως λέγεται είτε είναι method ( --> μέθοδος ή συνάρτηση ) είτε είναι attribute ( --> ιδιότητα ή μεταβλητή )
φτάνει να είσαι συνεπείς και να το χρησιμοποιείς με το όνομα του
και όχι να το δηλώνεις την μιά self.onoma και μετά να προσπαθείς να το προσπελάσεις με self.name

Κώδικας: Επιλογή όλων
class person:
    def __init__(self,tsoumbaouamba):
        self.trislalounkaidioxoreoun =tsoumbaouamba
    def sayhi(self):
        print ('hello ,my name is ',self.trislalounkaidioxoreoun)
    def __onomataki__(self):
        return self.trislalounkaidioxoreoun
    def __pou_anikeis__(self):
        return self # και print self  κάνει ...

Κώδικας: Επιλογή όλων
   
>>> p=person('Mbambis')
>>> p.sayhi()
('hello ,my name is ', 'Mbambis')
>>> p.__onomataki__()
'Mbambis'
>>> p.__pou_anikeis__()
<__main__.person instance at 0x28b2ef0>
>>> p.trislalounkaidioxoreoun
'Mbambis'



Δες εδώ
http://docs.python.org/tutorial/classes.html
για περισσότερα
Θέλουμε και μπορούμε να έχουμε μια καλύτερη ζωή και όσο θα ζούμε θα προσπαθούμε να την αποκτήσουμε ακόμα και αν πεθάνουμε προσπαθώντας, και αν κάποια στιγμή λιγίσουμε έχουμε το επίπεδο να πούμε κουράστηκα λίγο να ,να ξαποστάσουμε , ώστε να συνεχίσουμε πάλι δυνατοί ξανά.

Μήνυμα με αγάπη και αληλλεγγύη σε όλους τους ανθρώπους από όλους τους λαούς , ιδίως του Ελληνικού.
Άβαταρ μέλους
sokoban4ever
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 2331
Εγγραφή: 13 Φεβ 2009, 02:22
Εκτύπωση

Re: Μάθημα 5 - Μελέτη κώδικα Αντικειμενοστρεφής προγραμματισμός

Δημοσίευσηαπό malos » 07 Οκτ 2009, 02:23

class person:
Ορίσαμε ( δημιουργήσαμε) μία κλάση με το όνομα person

def __init__(self,tsoumbaouamba):
Ορίσαμε μία συνάρτηση που αποτελεί αντικείμενο της κλάσης (ΑΝΗΚΕΙ στην κλάση). Την προορίζουμε να παίξει ως μέθοδος της κλάσης
(αφού θα κληθεί η κλάση που θα την προσάψουμε στη μεταβλητή "p" και μετά την τελεία θα υποδείξουμε τη "μέθοδο κλήσης" της κλάσης.
ΟΤΙ ΕΙΝΑΙ ΜΕΤΑ ΤΗΝ ΤΕΛΕΙΑ ΕΙΝΑΙ ΜΕΘΟΔΟΣ. Σωστά ;
Δεν θα χρειαζτεί να πούμε το όνομα της συνάρτησης (μεθόδου) (__init__ αφού αρκεί να καλέσουμε τα ορίσματά της (τις τιμές δηλαδή που θα δώσουμε μετά στις μεταβλητές της)

self.trislalounkaidioxoreoun =tsoumbaouamba

Πλοκάδα της συνάρτησης __init__
Σου ορίζω μέθοδο ( μωρή __init__ ) την trislalounkaidioxoreoun και στο μέλλον θα είναι η δεύτερη μεταβλητή της __init__. Το όρισμα στην κλάση μας
Θα αποδωθεί (κληρονομηθεί) στη μεταβλητή αυτή ( tsoumbaouamba )

Μπορούν άμα γουστάρω να ακολουθήσουν 1500 γραμμές με την self όπου θα δίνω ορίσματα επί τόπου
self.ki_aloi_treis_laloyn_alla_den_xorevoun = "einai ntropaloi"
self.ki_enas_oraios_typos = "o sokoban"
self.stamata_na_glifeis_re = "malos"


Τα sayhi και onomataki τα αφήνω.

Συνεχίζουμε στα απο κάτω

>>> p=person('Mbambis')

Δίνουμε όρισμα στην κλάση μας που θα το κληρονομήσει το αντικείμενο tsoumbaouamba που θα ισούται - θα γίνει όρισμα της μεθόδου trislalounkaidioxoreoun

Καλά λέω τη λέξη κληρονομήσει; Εδώ πηγαίνει ;

Έχω κανένα ποσοστό επιτυχίας ( κατανόησης ) ;
Επεξεργαστής: AMD Ryzen 9 5900x
Μνήμη Gskill 16gb (2X8gb), 3200 mh, CL 14
Μητρική: Asrock X570 phantom gaming X
Τροφοδοτικό: Corsair 850 platinum
Δίσκος: SSD Corsair MP600 (1 TB)
Άβαταρ μέλους
malos
saintTUX
saintTUX
 
Δημοσιεύσεις: 1222
Εγγραφή: 02 Νοέμ 2008, 12:00
Εκτύπωση

Re: Μάθημα 5 - Μελέτη κώδικα Αντικειμενοστρεφής προγραμματισμός

Δημοσίευσηαπό da_perama1 » 07 Οκτ 2009, 09:08

Θα έλεγα ότι πρέπει να το δουλέψεις άλλο λίγο. Η class .... είναι στην ουσία μια μήτρα παραγωγής αντικειμένων ( objects ) ενός είδους. Κάθε φορά που καλούμε την class για να δημιουργήσει ένα αντικείμενο πρώτα εκτελεί την συνάρτηση __init__ στην οποία έχουμε δώσει τις απαραίτητες εντολές για την αρχικοποίηση του αντικειμένου. Η συνάρτηση __init__ δέχεται και μια σειρά μεταβλητών οι οποίες είναι απαραίτητες για την αρχικοποίηση του αντικειμένου.
Spoiler: show
Κώδικας: Επιλογή όλων
class car:
      def __init__ (self,a,k,i):
                   self.arithmosKyklof = a
                   self.kivismos = k
                   self.ippoi = i

c1 = car('AZA2345',1600,14)
print (c1.arithmosKyklof, str(c1.kivismos),str(c1.ippoi))

Οι μεταβλητές a,k,i χρησιμοποιιούνται μόνο για να μεταφέρουμε τον αριθμό κυκλοφορίας, τον κυβισμό και τους ίππους στο κάθε αντικείμενο αυτοκίνητο που δημιουργούμε.
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.04 precise 64bit (el_GR.UTF-8), Ubuntu 3.0.0-17-generic
3 Intel Core i5 CPU 650 3.20GHz ‖ RAM 7783 MiB ‖ Intel DH55TC -
4 Intel Core Processor Integrated Graphics Controller [8086:0042] (rev 02)
5 eth0: Intel 82578DC Gigabit Network Connection [8086:10f0] (rev 06)
da_perama1
punkTUX
punkTUX
 
Δημοσιεύσεις: 289
Εγγραφή: 11 Νοέμ 2008, 20:35
Τοποθεσία: Κέρκυρα
Εκτύπωση

Re: Μάθημα 5 - Μελέτη κώδικα Αντικειμενοστρεφής προγραμματισμός

Δημοσίευσηαπό sokoban4ever » 07 Οκτ 2009, 10:23

@malos
χοντρικά οι συναρτήσεις μέσα σε μια class λέγονται μέθοδοι και οι μεταβλητές ιδιότητες

Κάποιες συναρτήσεις όπως η __init__ έχουν επικρατήσει απλά κατά σύμβαση να παίζουν το ρόλο του constructor .
Το __init__ κατάγεται από την αγγλική λέξη instantiation...
instantiation ποιού ; :think:
Μα του αντικειμένου ή αλλιώς το instance μιας κλάσης φυσικά :D
μπορείς να βάλεις __souxoumouxoumantalakia__ αν θές......

Ο constructor δημιουργεί τα instances μιας κλάσης καθώς είναι η πρώτη μέθοδος που εκτελείτε ακούσια όταν δημιουργείται ένα instance
πχ το p :
Κώδικας: Επιλογή όλων
p = person('Mbambis')

αυτό είναι αρκετό για να είναι μια κλάση μήτρα πολλών instances αντικειμένων
πχ
Κώδικας: Επιλογή όλων
m = person('Manousos')
k= person('Korina')
a= person('Agamemnonas')
n = person('Antigoni')


Επίσης το γεγονός ότι οτιδήποτε είναι αντικείμενο κάνει την python μια
ικανότατη αντικειμενοστραφής γλώσσα ( πέρα από το ότι είναι multi-paradigm είναι και αντικειμενοστραφής)
Θέλουμε και μπορούμε να έχουμε μια καλύτερη ζωή και όσο θα ζούμε θα προσπαθούμε να την αποκτήσουμε ακόμα και αν πεθάνουμε προσπαθώντας, και αν κάποια στιγμή λιγίσουμε έχουμε το επίπεδο να πούμε κουράστηκα λίγο να ,να ξαποστάσουμε , ώστε να συνεχίσουμε πάλι δυνατοί ξανά.

Μήνυμα με αγάπη και αληλλεγγύη σε όλους τους ανθρώπους από όλους τους λαούς , ιδίως του Ελληνικού.
Άβαταρ μέλους
sokoban4ever
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 2331
Εγγραφή: 13 Φεβ 2009, 02:22
Εκτύπωση

Re: Μάθημα 5 - Μελέτη κώδικα Αντικειμενοστρεφής προγραμματισμός

Δημοσίευσηαπό AngelBreath » 07 Οκτ 2009, 13:49

Ρε παιδια, να ρωτησω κατι γιατι μαλλον εχω χασει επεισοδια. Μετα το μαθημα 3, ειναι το 4 που ειναι επανάληψη, και μετα το 5. Μετα δηλαδη απο συναρτησεις παμε "Δομη προγραμματος" και "Αντικειμενοστραφης προγραμματισμός" σωστά? Γιατι εκει που ημουν χαρουμενος οτι ειμαι σε καλο δρομο, ξαφνικα εχασα την μπαλα.Μηπως εχω χασει κανενα κεφαλαιο?
AngelBreath
babeTUX
babeTUX
 
Δημοσιεύσεις: 46
Εγγραφή: 05 Νοέμ 2008, 23:29
Εκτύπωση

Επόμενο

Επιστροφή στο Μαθήματα python