Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Έχω μια απορία σχετικά με τον κώδικα εδώ:

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

;

 

 

 

Επεξ/σία από DIMITRISG
Δημοσ.

Εγώ θέλω να δίνω ορίσματα με τιμές για το γράφημα.

Οπότε την αντίστοιχη μέθοδο του παραδείγματος compute_initial_figure την έχω αφαιρέσει από την abstract class

  • Sad 1
Δημοσ.

χωρίς να γνωρίζω σχετικά με Qt , εφόσον πρόκειται για άδεια συνάρτηση που εκτελείται κανονικά ούτε η συγκεκριμένη μέθοδος είναι abstract άρα και κατ επέκταση ούτε και η συγκεκριμένη κλάση είναι abstract. Μια απλή base class είναι.

Τώρα για να την έχουν εκεί υποθέτω έχει τη δική της χρήση αλλά αν δεν έχεις κάποιο συγκεκριμένο λόγο να κυκλοφορεί κάπου το MyMplCanvas σαν τύπος δεν χρειάζεται καν να κληρονομείται η μέθοδος. Δυναμική γλώσσα είναι η python duck typing υποστηρίζει άρα και χύμα να την καλείς δεν υπάρχει θέμα.

  • Thanks 1
Δημοσ.

Για να ήταν abstract η κλάση, θα έπρεπε η συγκεκριμένη μέθοδος να πετάει NotImplementedError. 

Το πιο πιθανό είναι η μέθοδος να χρησιμοποιείτε σε κάποιο call chain. Επειδή είναι NoOP να μην το βλέπει ο χρήστης, αλλά να δίνει δυνατότητα να κάνει κάτι όντως εάν το επιθυμεί ο χρήστης. 

Δημοσ.
Στις 2/18/2018 στις 8:59 ΠΜ, DIMITRISG είπε

Εγώ θέλω να δίνω ορίσματα με τιμές για το γράφημα.

Οπότε την αντίστοιχη μέθοδο του παραδείγματος compute_initial_figure την έχω αφαιρέσει από την abstract class

Κακώς :(

Πρέπει να την αφαιρέσεις και από την __init__ δεν υπάρχει λόγος όμως ένα pass έχει όλο κιολο

 

Δημοσ.

Εγώ υπέθεσα ότι θα είναι στα πλαίσια της σωστής πρακτικής για τις κλάσεις για αυτό το ρώτησα

Δηλαδή ότι ο ορθός τρόπος θα ήταν να πρέπει να υπάρχει πάντα abstract κλάση με την αρχικοποίηση της κάθε μεθόδου

Δημοσ.

Σε αυτά τα πράγματα δεν υπάρχει απόλυτα σωστό και λάθος. Αν θες να κάνεις enforce ενα συγκεκριμένο API τότε καλό είναι να χρησιμοποιήσεις explicit abstract classes. Ο σκοπος του παραδείγματος αυτού όμως δεν είναι να σε κάνει να καταλάβεις abstract classes κτλ. Ως εκ τούτου προσπαθεί να κρατήσει τα πράγματα απλά χωρίς να σε υποχρεώσει να ξέρεις/διαβάσεις τις ιδιαιτερότητες των python abstract classes. Λογικό, καθώς οι scientific libs όπως το matplotlib συχνά χρησιμοποιούνται από άτομα που προέρχονται από άλλες επιστήμες (άρα πιθανά δεν ξέρουν καν τι είναι abstract class) και γιατί θέλει να σου εξηγήσει πως να εξηγήσεις το FigureCanvas.

Αν θες να μάθεις περισσότερα για python και abstract classes διάβασε αυτό:

https://pymotw.com/3/abc/

 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...