Συζήτηση
Γεια χαρά, Επισκέπτης
Όνομα χρήστη: Κωδικός: Να με θυμάσαι

ΘΕΜΑ: Κάτι που όλοι πρέπει να ξέρετε για κλάσεις σε python

Κάτι που όλοι πρέπει να ξέρετε για κλάσεις σε python 7 Χρόνια 5 Μήνες πριν #3876

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Προγραμματίζω σε python εδώ και 5 χρόνια και πριν λίγο καιρό παρατήρησα κάτι το οποίο δεν το γνώριζα και πραγματικά μου δημιουργούσε τρομερά λογικά λάθη. Για αυτό σκέφτηκα να κάνω ένα post ώστε όσοι δεν το γνωρίζουν να το μάθουν.

Όταν χρησιμοποιείτε αντικειμενοστραφή προγραμματισμό με python όποτε αλλάζετε μια μεταβλητή
μιας κλάσης πάντα να το κάνετε μέσω μεθόδων.

Ο λόγος είναι ο εξής:

Ας πούμε ότι έχω την κλάση:
class MyClass:
 
    def __init__(self):
        self.name = "A Name"

και ότι το obj είναι ένα αντικείμενο αυτής της κλάσης.

Για να αλλάξω την τιμή του name μπορώ να κάνω το εξής:
obj.name = "A new name"

Ας πούμε όμως ότι έκανα λάθος και έγραψα :
obj.nama = "A new name"

Αντί για name έγραψα nama. Αν και οι περισσότεροι θα περιμένετε να πετάξει error, αυτό που θα γίνει στην ουσία είναι ότι θα δημιουργηθεί μια νέα μεταβλητή κατά την εκτέλεση του προγράμματος με το όνομα nama. Επομένος ενώ εσείς περιμένατε να αλλάξετε την τιμή του obj.name στην ουσία δημιουργήσατε μια νέα, με όνομα obj.nama.

Επομένως βλέπετε πόσο εύκολο είναι στην python, να κάνεις ένα τέτοιο λογικό λάθος χωρίς να το θέλεις.

Επειδή το πάθαινα συχνά, αποφάσισα να κάνω το εξής:

Θα χρησιμοποιώ μεθόδους για να γράφω τις μεταβλητές κλάσεων, ενώ για να τις διαβάσω θα χρησιμοποιώ απευθείας το όνομα.

πχ
class MyClass:
 
    def __init__(self):
        self.name = "A Name"
 
    def setName(self, new_name):
        self.name = new_name
 
 
obj = MyClass()
 
obj.setName("Nikos")
 
print(obj.name)

Πιστεύω είναι κάτι πολύ χρήσιμο να το έχετε υπόψη σας γιατί είναι κάτι πολύ λεπτό το οποίο δεν ισχύει σε άλλες αντικειμενοστραφής γλώσσες όπως η java.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Κάτι που όλοι πρέπει να ξέρετε για κλάσεις σε python 7 Χρόνια 5 Μήνες πριν #3885

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
Το σωστό είναι να κάνεις την ιδιότητα private και να ορίσεις και έναν getter

class MyClass:
def __init__(self, name=None):
self.__name = name
def setName(self, name):
self.__name = name
def getName(self):
return self.__name

>>> a=MyClass()
>>> a.name
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
a.name
AttributeError: 'MyClass' object has no attribute 'name'
>>> a.setName('Theo')
>>> a.getName()
'Theo'
>>> a.name
Traceback (most recent call last):
File "<pyshell#19>", line 1, in <module>
a.name
AttributeError: 'MyClass' object has no attribute 'name'
>>>
Τελευταία διόρθωση: 7 Χρόνια 5 Μήνες πριν από Theo.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Κάτι που όλοι πρέπει να ξέρετε για κλάσεις σε python 7 Χρόνια 5 Μήνες πριν #3889

  • babaliaris1
  • Το Άβαταρ του/της babaliaris1
  • Αποσυνδεμένος
  • python
  • Δημοσιεύσεις: 445
  • Ληφθείσες Ευχαριστίες 75
Βασικά στην python δεν υπάρχουν modifiers. Απλώς τα underscore στο όνομα μιας μεταβλητής σημαίνει ότι αυτός που χρησιμοποιεί την κλάση δεν θα πρέπει να τα "πειράζει". Είναι απλός κάτι που συμφώνησαν οι προγραμματιστές να κάνουν.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Κάτι που όλοι πρέπει να ξέρετε για κλάσεις σε python 7 Χρόνια 5 Μήνες πριν #3892

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
Τo διπλό underscore στην ιδιότητα μιας κλάσσης την κάνει prive και δεν έχεις πρόσβαση με το
obj.attribute, δοκίμασέ το.
www.python-course.eu/python3_object_oriented_programming.php
Αν θέλεις να περιορίσεις τις ιδιότητες μιας κλάσσης σου ώστε να μην καλείς λάθος όνομα χρησιμοποιείς το
__slots__=['attribete1', 'attribute2',...]
>>> class A:
	__slots__=['x','y']
	pass
 
>>> b=A()
>>> b.x=3
>>> b.x
3
>>> b.z=6
Traceback (most recent call last):
  File "<pyshell#27>", line 1, in <module>
    b.z=6
AttributeError: 'A' object has no attribute 'z'
Τελευταία διόρθωση: 7 Χρόνια 5 Μήνες πριν από pmav99.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Συντονιστές: pmav99
Χρόνος δημιουργίας σελίδας: 0.450 δευτερόλεπτα

Μοιράσου το!

Powered by CoalaWeb

Λίστα Ταχυδρομείου