Η επέκταση τάξεις βάση στην Python

ψήφοι
10

Προσπαθώ να επεκτείνει κάποια «βάση» μαθήματα Python:

class xlist (list):
    def len(self):
        return len(self)

    def add(self, *args):
        self.extend(args)
        return None


class xint (int):
    def add(self, value):
        self += value
        return self


x = xlist([1,2,3])
print x.len()   ## >>> 3 ok
print x         ## >>> [1,2,3] ok
x.add (4, 5, 6)
print x         ## >>> [1,2,3,4,5,6] ok

x = xint(10)
print x         ## >>> 10 ok
x.add (2)
print x         ## >>> 10  # Not ok (#1)

print type(x)         ## >>> <class '__main__.xint'> ok
x += 5
print type(x)         ## >>> <type 'int'>  # Not ok (#2)

Λειτουργεί πρόστιμο στον κατάλογο περίπτωση, επειδή η προσάρτησης μέθοδος τροποποιεί το αντικείμενο «στη θέση του», χωρίς να την επιστρέψει. Αλλά στην int περίπτωση, η προσθήκη μέθοδος δεν τροποποιεί την αξία της εξωτερικής x μεταβλητή. Υποθέτω ότι είναι εντάξει με την έννοια ότι αυτο είναι μια τοπική μεταβλητή στην προσθήκη μέθοδο της κατηγορίας, αλλά αυτό μου πρόληψη από την τροποποίηση της αρχικής τιμής αποδίδεται στην παρουσία της κλάσης.

Είναι δυνατόν να επεκταθεί μια κατηγορία με αυτόν τον τρόπο ή θα πρέπει να καθορίσει ένα ακίνητο τάξη με τον τύπο βάσης και χαρτογραφήσει όλες τις απαραίτητες μεθόδους για αυτό το ακίνητο;

Δημοσιεύθηκε 28/08/2008 στις 21:18
πηγή χρήστη
Σε άλλες γλώσσες...                            


4 απαντήσεις

ψήφοι
0

Ints είναι αμετάβλητο και δεν μπορείτε να τροποποιήσετε στη θέση του, οπότε θα πρέπει να πάτε με την επιλογή # 2 (επειδή η επιλογή # 1 είναι αδύνατη χωρίς κάποια πονηριά).

Απαντήθηκε 28/08/2008 στις 21:28
πηγή χρήστη

ψήφοι
5

int είναι ένα είδος αξίας, έτσι ώστε κάθε φορά που κάνετε μια εργασία, (π.χ. δύο περιπτώσεις + = πάνω), δεν τροποποιεί το αντικείμενο που έχετε στο σωρό, αλλά αντικαθιστά την αναφορά με ένα από τα αποτελέσματα του δεξιού χεριού πλευρά του εκχώρησης (δηλαδή int)

κατάλογος δεν είναι ένας τύπος αξία, γι 'αυτό δεν δεσμεύεται από τους ίδιους κανόνες.

Αυτή η σελίδα έχει περισσότερες λεπτομέρειες σχετικά με τις διαφορές: http://docs.python.org/ref/objects.html

Του ΙΜΟ, ναι, θα πρέπει να ορίσετε μια νέα τάξη που κρατά μια int ως μεταβλητή π.χ.

Απαντήθηκε 28/08/2008 στις 21:32
πηγή χρήστη

ψήφοι
23

Δύο σας xintπαραδείγματα δεν εργάζονται για δύο διαφορετικούς λόγους.

Το πρώτο δεν λειτουργεί επειδή self += valueείναι ισοδύναμο με self = self + valueτο οποίο μόλις εκχωρεί εκ νέου την τοπική μεταβλητή selfσε ένα διαφορετικό αντικείμενο (ένας ακέραιος), αλλά δεν αλλάζει το αρχικό αντικείμενο. Δεν μπορείτε πραγματικά να πάρετε αυτό το

>>> x = xint(10)
>>> x.add(2)

να συνεργαστεί με μια υποκατηγορία της intαπό το ακέραιοι είναι αμετάβλητος .

Για να πάρει το δεύτερο στην εργασία, μπορείτε να ορίσετε μια __add__μέθοδο , όπως έτσι:

class xint(int):
    def __add__(self, value):
        return xint(int.__add__(self, value))

>>> x = xint(10)
>>> type(x)
<class '__main__.xint'>
>>> x += 3
>>> x
13
>>> type(x)
<class '__main__.xint'>
Απαντήθηκε 28/08/2008 στις 22:41
πηγή χρήστη

ψήφοι
2

i επεκτάθηκε σας XLIST τάξης μόλις λίγο, έκανε ώστε να μπορείτε να βρείτε όλα τα σημεία του δείκτη του αριθμού καθιστώντας έτσι μπορείτε να επεκτείνετε με πολλαπλές λίστες ταυτόχρονα καθιστά προετοιμαστεί και να γίνει έτσι ώστε να μπορείτε να μετακινηθείτε μέσα από αυτό

class xlist:
    def __init__(self,alist):
        if type(alist)==type(' '):
            self.alist = [int(i) for i in alist.split(' ')]
        else:
            self.alist = alist
    def __iter__(self):
        i = 0
        while i<len(self.alist):
            yield self.alist[i]
            i+=1
    def len(self):
        return len(self.alist)
    def add(self, *args):
        if type(args[0])==type([1]):
            if len(args)>1:
                tmp = []
                [tmp.extend(i) for i in args]
                args = tmp
            else:args = args[0]
        if type(args)==type(''):args = [int(i) for i in args.split(' ')] 
        (self.alist).extend(args)
        return None
    def index(self,val):
        gen = (i for i,x in enumerate(self.alist) if x == val)
        return list(gen)
Απαντήθηκε 24/07/2011 στις 19:30
πηγή χρήστη

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