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

ΘΕΜΑ: Ερώτηση σχετικά με τις κλάσεις

Ερώτηση σχετικά με τις κλάσεις 10 Χρόνια 4 Μήνες πριν #2216

  • dimitris_k
  • Το Άβαταρ του/της dimitris_k
  • Αποσυνδεμένος
  • p_____
  • Δημοσιεύσεις: 2
Καλησπέρα,
είμαι καινούριος στο forum και θα ήθελα να υποβάλω την εξής ερώτηση που αφορά στις κλάσεις της python (2.7):

Έστω ότι ορίζω την παρακάτω κλάση:
class my_data():
   def __init__(self,data1,data2,data3):
      self.data1 = data1
      self.data2 = data2
      self.data3 = data3

και στη συνέχεια καλώ instances της κλάσης, όπως π.χ.:
d1 = my_data(1,2,3)
d2 = my_data(4,5,d1)
d3 = my_data(7,8,d2)

Μέχρι εδώ έχει καλώς, όμως στη συνέχεια θέλω να δοκιμάσω το εξής:
d2 = my_data(4,5,d1)
d1 = my_data(1,2,3)
d3 = my_data(7,8,d2)

Εδώ ο κώδικας βγάζει NameError γιατί προφανώς το d1 δεν έχει οριστεί.

Επομένως η ερώτησή μου είναι η εξής:
Πώς θα τροποποιήσω την κλάση ώστε αν ένα όρισμα του instance δεν υπάρχει, να δημιουργείται και στη συνέχεια να δημιουργείται και το instance, δηλαδή εν προκειμένω, όταν γράφουμε
d2 = my_data(4,5,d1)
πρώτα να δημιουργείται το d1 έστω ως
d1 = my_data(None,None,None)
και στη συνέχεια το d2

Δοκίμασα το εξής αλλά δε λειτουργεί:
class my_data():
   def __init__(self,data1,data2,data3):
      self.data1 = data1
      self.data2 = data2
      try:
         self.data3 = data3
      except:
         data3 = my_data(None,None,None)
	 self.data3 = data3

Ευχαριστώ,

Δημήτρης
Τελευταία διόρθωση: 10 Χρόνια 4 Μήνες πριν από dimitris_k.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Ερώτηση σχετικά με τις κλάσεις 10 Χρόνια 4 Μήνες πριν #2218

  • myle
  • Το Άβαταρ του/της myle
  • Αποσυνδεμένος
  • Admin
  • Δημοσιεύσεις: 467
  • Ληφθείσες Ευχαριστίες 15
Γεια σου συνονόματε!

Πιο απλό δε θα ήταν να περνάς ακριβώς όσα ορίσματα χρειάζεσαι;

Πχ
d2 = my_data(4,5)

και στην περίπτωση που λείπει κάποιο, να προσδιορίσεις τι ακριβώς θέλεις να γίνεται; Δες παρακάτω για ένα παράδειγμα:
class my_data():
   def __init__(self,data1,data2,data3=None):
      self.data1 = data1
      self.data2 = data2
      if data3 is not None:
        self.data3 = data3
      else:
        self.data3 = my_data(1, 2, 3)
«Αν υποθέσουμε ότι αυτό είναι δυνατό, (να μεταδώσουμε τη σοφία παντού) τότε ειλικρινά ο τρόπος ζωής των θεών θα περάσει στους ανθρώπους. Τα πάντα θα είναι γεμάτα...
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Ερώτηση σχετικά με τις κλάσεις 10 Χρόνια 4 Μήνες πριν #2219

  • dimitris_k
  • Το Άβαταρ του/της dimitris_k
  • Αποσυνδεμένος
  • p_____
  • Δημοσιεύσεις: 2
Δημήτρη (myle), σε ευχαριστώ για την άμεση απάντηση σου.

Όπως ανέφερες, όντως είναι σωστό να περνάς όσα ορίσματα χρειάζεσαι. Στην περίπτωσή μου όμως χρειάζομαι και τα τρία ορίσματα.

Θέλω να αναπαραστήσω ένα υδραυλικό δίκτυο σωληνωτών αγωγών με μια δομή τύπου structural tree, όπου τα ορίσματα του κάθε αγωγού θα είναι της μορφής
data1, data2, parent
, για παράδειγμα:
Μήκος, Παροχή, Αγωγός που προηγείται

Έτσι, αν εισαχθεί πρώτος ο αγωγός d2 χωρίς να έχει οριστεί ο parent του d2 δηλαδή ο d1, να ορίζεται πρώτα ο d1, έστω ως dummy:
d1 = my_data(None,None,None)
ώστε ο d2 στη συνέχεια να μην είναι μετέωρος.

Μία επιπλέον ερώτηση:
Έστω ότι ορίζουμε τα instances d1, d2, d3, ... όπως περιγράψαμε παραπάνω. Με ποιο τρόπο μπορούμε μέσα στην κλάση κάθε φορά που γίνεται initiation ενός instance ,το instance να μπαίνει σε μία λίστα ώστε κάθε φορά που την καλούμε, π.χ.
my_data.my_list()
, να μας δίνει
[d1, d2, d3, ...]

Ευχαριστώ και πάλι,

Δημήτρης
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Ερώτηση σχετικά με τις κλάσεις 10 Χρόνια 4 Μήνες πριν #2220

  • pmav99
  • Το Άβαταρ του/της pmav99
  • Αποσυνδεμένος
  • Author
  • Δημοσιεύσεις: 684
  • Ληφθείσες Ευχαριστίες 111
Δεν ξέρω αν είναι αυτό που θες, αλλά μία λυση είναι να χρησιμοποιήσεις class attributes. Έτσι ολα τα instances θα ξέρουν πάντα πόσα instances έχουν δημιουργηθεί.
class MyClass(object):
    my_list = []
    def __init__(self,data1, data2, data3=None):
        self.data1 = data1
        self.data2 = data2
        if data3 is not None:
            self.data3 = data3
        else:
            self.data3 = temp = MyClass(1, 2, 3)
            self.my_list.append(temp)
        self.my_list.append(self)

Αν όμως θες να φτιάξεις ένα tree, τοτε καλύτερα να υλοποιήσεις (θα βρεις πολλά έτοιμα στο νετ) το data structure που ταιριάζει σε αυτό που θες να κανεις.

Google : Python + Data structures
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Συντονιστές: pmav99
Χρόνος δημιουργίας σελίδας: 0.368 δευτερόλεπτα

Μοιράσου το!

Powered by CoalaWeb

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