Python baz sınıflarını genişletme

oy
10

Python içinde bazı temel sınıfları genişletmek için çalışıyorum:

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)

Bu ince işleri liste çünkü durumunda ekleme yöntemi bunu dönmeden, yerinde nesne değiştirir. Fakat içinde int durumda, ekleme yöntemi dış değerini değiştirmez X değişkeni. O anlamda gayet varsayalım kendini yerel bir değişkendir eklenti sınıfının yöntemine ancak bu sınıfın örneğine atanmış başlangıç değeri değiştirmesini beni engelliyor.

Bir sınıf bu şekilde genişletmek veya bu mülke tüm gerekli yöntemleri taban türüne sahip bir sınıf özellik tanımlamak ve haritalandırmalıdır mümkün mü?

Oluştur 28/08/2008 saat 21:18
kaynak kullanıcı
Diğer dillerde...                            


4 cevaplar

oy
0

Ints iletmenin ve yerinde bunları değiştiremez, böylece seçenek 2. (opsiyon 1. nasm'ın olmadan mümkün olduğu için) ile gitmeli.

Cevap 28/08/2008 saat 21:28
kaynak kullanıcı

oy
5

int bir değer türü, yani her bir atama, (örneğin, iki örneği yapmak + = , bu yığın üzerinde nesne değiştirmez) varsa da, sağ elin sonucu biri ile referans yerine atama tarafı (yani, bir int)

Liste bir değer türü değil, bu nedenle aynı kurallara bağlı değildir.

Bu sayfayı farklar hakkında daha fazla bilgi içeren: http://docs.python.org/ref/objects.html

IMO, evet, bir örnek değişkeni olarak bir int tutan yeni bir sınıf tanımlamak gerekir

Cevap 28/08/2008 saat 21:32
kaynak kullanıcı

oy
23

Sizin iki xintörnek iki farklı nedenlerle çalışmaz.

Çünkü çalışmıyor ilk self += valueeşdeğerdir self = self + valuesadece yerel değişkeni yeniden atar ki selffarklı bir nesne (bir tamsayı) için ancak orijinal nesneyi değişmez. Gerçekten bu alamayan

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

bir alt sınıf ile çalışmak inttamsayılar olduğundan değişmez .

Bir tanımlayabilirsiniz çalışmaya ikincisini almak için __add__yöntem şöyle:

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'>
Cevap 28/08/2008 saat 22:41
kaynak kullanıcı

oy
2

i bir kez başlatmak yapma ve bu nedenle bununla yineleyebilirsiniz kılmayı birden fazla liste ile uzatabilirsiniz böylece o kadar bunu yapma Bir sayının tüm dizin noktalarını bulabiliriz yapılan, sadece biraz sınıfını XLIST genişletilmiş

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)
Cevap 24/07/2011 saat 19:30
kaynak kullanıcı

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