python: αναφορά ονομάτων «ιδιωτικών» μεταβλητών με οργανωμένο τρόπο

ψήφοι
0

Ας υποθέσουμε ότι έχω μια τάξη, και θέλω να αναφέρετε κάποια στοιχεία στο __dict__(για παράδειγμα, θέλω να αντιγράψετε το dict και να διαγράψετε την ιδιότητα που δεν μπορεί να τουρσί), μέσα από την τάξη .

Το πρόβλημα είναι, αυτά τα χαρακτηριστικά είναι «ιδιωτική», ώστε κωδικό μου καταλήγει μοιάζοντας έτσι

class MyClasss(object):
    def __init__(self):
          self.__prv=1
    def __getstate__(self):
          ret=self.__dict__.copy()
          del ret['_MyClass__prv']

Έχω αναφορά το όνομα της κλάσης ρητά στη δήλωση del, η οποία φαίνεται λίγο άσχημο για μένα. Υπάρχει κάτι καλύτερο; κάτι όπωςMyClass.getPrivateString('prv')

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

Δημοσιεύθηκε 26/08/2010 στις 19:37
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
6

Σκεφτείτε να χρησιμοποιήσετε μόνο ένα χαρακτήρα υπογράμμισης για τις ιδιωτικές ιδιότητες. Αυτά εξακολουθούν να θεωρούνται ιδιωτικές, αλλά δεν παίρνουν το όνομά παραμορφωμένα.

class MyClasss(object):
    def __init__(self):
          self._prv=1
    def __getstate__(self):
          ret=self.__dict__.copy()
          del ret['_prv']
Απαντήθηκε 26/08/2010 στις 19:41
πηγή χρήστη

ψήφοι
0

Μπορείτε να δοκιμάσετε να δημιουργήσετε ένα αντίγραφο του αντικειμένου, να διαγράψει ιδιωτικά χαρακτηριστικά του και στη συνέχεια επιστρέφουν τους __dict__, κάτι σαν:

class X:
  def __init__(self):
    self.__prv = 0

  def del_privates(self):
    del self.__prv

  def __getstate__(self):
    other = X()
    other.__dict__ = self.__dict__.copy()
    other.del_privates()
    return other.__dict__

Μετά την κλήση __getstate__, το επιστρεφόμενο dict δεν θα έχει το __prvμέλος, δεδομένου ότι παίρνει διαγράφονται όταν other.del_privates()καλείται.

Απαντήθηκε 26/08/2010 στις 19:50
πηγή χρήστη

ψήφοι
0

Δεν υπάρχει συντόμευση, αλλά αν απλά θέλετε να αποφύγετε την ονομασία της κατηγορίας ρητά, μπορείτε να κάνετε κάτι σαν:

del ret["_%s__%s" % (self.__class__.__name__, "prv")]
Απαντήθηκε 26/08/2010 στις 20:34
πηγή χρήστη

ψήφοι
-1

Καλύτερα να χρησιμοποιούν το δικό σύμβαση ονομασίας σας για αυτές τις ιδιότητες, όπως _prv_x, _prv_yκλπ, στη συνέχεια, μπορείτε να χρησιμοποιήσετε ένα βρόχο για την επιλεκτική αφαίρεση τους

class MyClasss(object):
    def __init__(self):
          self._prv_x=1
          self._prv_y=1
    def __getstate__(self):
          return dict((k,v) for k,v in vars(self).items() if not k.startswith("_prv_"))

Σε python2.7 +

    def __getstate__(self):
          return {k:v for k,v in vars(self).items() if not k.startswith("_prv_")}
Απαντήθηκε 26/08/2010 στις 21:22
πηγή χρήστη

ψήφοι
0

Στο τέλος, θα χρησιμοποιηθεί μια παραλλαγή της λύσης thieger του

del ret["_%s__%s" % (MyClasss.__name__, "prv")]

Νομίζω ότι αυτό είναι το πιο εύρωστο τρόπο μπορώ να γράψω αυτό το κομμάτι του κώδικα, εκτός από δίνοντας την κατακρεούργηση, το οποίο θα μπορούσε να είναι το σωστό πράγμα που κάνει, αλλά ρωτούσα τι πρέπει να κάνετε σε περίπτωση που πραγματικά έχουν κατασπαράζουν :)

Απαντήθηκε 29/08/2010 στις 20:24
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more