DIMITRISG Δημοσ. 17 Φεβρουαρίου 2018 Δημοσ. 17 Φεβρουαρίου 2018 (επεξεργασμένο) Έχω μια απορία σχετικά με τον κώδικα εδώ: class MyMplCanvas(FigureCanvas): """Ultimately, this is a QWidget (as well as a FigureCanvasAgg, etc.).""" def __init__(self, parent=None, width=5, height=4, dpi=100): fig = Figure(figsize=(width, height), dpi=dpi) self.axes = fig.add_subplot(111) self.compute_initial_figure() FigureCanvas.__init__(self, fig) self.setParent(parent) FigureCanvas.setSizePolicy(self, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) FigureCanvas.updateGeometry(self) def compute_initial_figure(self): pass class MyStaticMplCanvas(MyMplCanvas): """Simple canvas with a sine plot.""" def compute_initial_figure(self): t = arange(0.0, 3.0, 0.01) s = sin(2*pi*t) self.axes.plot(t, s) https://matplotlib.org/examples/user_interfaces/embedding_in_qt5.html Γιατί η κλάση MyMplCanvas έχει την μέθοδο def compute_initial_figure(self): pass ; Επεξ/σία 17 Φεβρουαρίου 2018 από DIMITRISG
πέρα στους πέρα κάμπους Δημοσ. 17 Φεβρουαρίου 2018 Δημοσ. 17 Φεβρουαρίου 2018 Είναι abstract class, την οποία πρέπει να ορίσεις εσύ κάθε φορά που φτιάχνεις μία δική σου κλάση με βάση την MyMplCanvas: class MyStaticMplCanvas(MyMplCanvas):
DIMITRISG Δημοσ. 18 Φεβρουαρίου 2018 Μέλος Δημοσ. 18 Φεβρουαρίου 2018 Εγώ θέλω να δίνω ορίσματα με τιμές για το γράφημα. Οπότε την αντίστοιχη μέθοδο του παραδείγματος compute_initial_figure την έχω αφαιρέσει από την abstract class 1
the other one Δημοσ. 19 Φεβρουαρίου 2018 Δημοσ. 19 Φεβρουαρίου 2018 χωρίς να γνωρίζω σχετικά με Qt , εφόσον πρόκειται για άδεια συνάρτηση που εκτελείται κανονικά ούτε η συγκεκριμένη μέθοδος είναι abstract άρα και κατ επέκταση ούτε και η συγκεκριμένη κλάση είναι abstract. Μια απλή base class είναι. Τώρα για να την έχουν εκεί υποθέτω έχει τη δική της χρήση αλλά αν δεν έχεις κάποιο συγκεκριμένο λόγο να κυκλοφορεί κάπου το MyMplCanvas σαν τύπος δεν χρειάζεται καν να κληρονομείται η μέθοδος. Δυναμική γλώσσα είναι η python duck typing υποστηρίζει άρα και χύμα να την καλείς δεν υπάρχει θέμα. 1
kaydi Δημοσ. 22 Φεβρουαρίου 2018 Δημοσ. 22 Φεβρουαρίου 2018 Για να ήταν abstract η κλάση, θα έπρεπε η συγκεκριμένη μέθοδος να πετάει NotImplementedError. Το πιο πιθανό είναι η μέθοδος να χρησιμοποιείτε σε κάποιο call chain. Επειδή είναι NoOP να μην το βλέπει ο χρήστης, αλλά να δίνει δυνατότητα να κάνει κάτι όντως εάν το επιθυμεί ο χρήστης.
k33theod Δημοσ. 22 Φεβρουαρίου 2018 Δημοσ. 22 Φεβρουαρίου 2018 Στις 2/18/2018 στις 8:59 ΠΜ, DIMITRISG είπε Εγώ θέλω να δίνω ορίσματα με τιμές για το γράφημα. Οπότε την αντίστοιχη μέθοδο του παραδείγματος compute_initial_figure την έχω αφαιρέσει από την abstract class Κακώς Πρέπει να την αφαιρέσεις και από την __init__ δεν υπάρχει λόγος όμως ένα pass έχει όλο κιολο
DIMITRISG Δημοσ. 22 Φεβρουαρίου 2018 Μέλος Δημοσ. 22 Φεβρουαρίου 2018 Εγώ υπέθεσα ότι θα είναι στα πλαίσια της σωστής πρακτικής για τις κλάσεις για αυτό το ρώτησα Δηλαδή ότι ο ορθός τρόπος θα ήταν να πρέπει να υπάρχει πάντα abstract κλάση με την αρχικοποίηση της κάθε μεθόδου
pmav99 Δημοσ. 22 Φεβρουαρίου 2018 Δημοσ. 22 Φεβρουαρίου 2018 Σε αυτά τα πράγματα δεν υπάρχει απόλυτα σωστό και λάθος. Αν θες να κάνεις enforce ενα συγκεκριμένο API τότε καλό είναι να χρησιμοποιήσεις explicit abstract classes. Ο σκοπος του παραδείγματος αυτού όμως δεν είναι να σε κάνει να καταλάβεις abstract classes κτλ. Ως εκ τούτου προσπαθεί να κρατήσει τα πράγματα απλά χωρίς να σε υποχρεώσει να ξέρεις/διαβάσεις τις ιδιαιτερότητες των python abstract classes. Λογικό, καθώς οι scientific libs όπως το matplotlib συχνά χρησιμοποιούνται από άτομα που προέρχονται από άλλες επιστήμες (άρα πιθανά δεν ξέρουν καν τι είναι abstract class) και γιατί θέλει να σου εξηγήσει πως να εξηγήσεις το FigureCanvas. Αν θες να μάθεις περισσότερα για python και abstract classes διάβασε αυτό: https://pymotw.com/3/abc/
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα