2009-05-28 12 views
6

Bu, 912526 - How do I pass lots of variables to and from a function in Python? numaralı soruların bir takip numarasıdır.Python'un liste sınıfından türetilen sınıflar nasıl kullanılır?

Yazdığım programda geçilmesi gereken birçok değişken var ve önceki sorudan, bu değişkenleri sınıflara koymam gerektiğini ve sonra sınıfları geçtiğimi anlıyorum.

Bu değişkenlerin bazıları tekrarlı setler halinde gelir - ince film hesaplaması için, bir dizi katman için optik özellikleri (kırılma indeksi, absorpsiyon, kalınlık, vb.) Izlemem gerekir.

Her biri tek bir katman için değişkenleri tutan sınıf kümesini saklamak için bir Python listesinden türetilmiş bir sınıf oluşturmak için bu gibi değişkenleri depolamanın en iyi yolu nedir? Ardından, listeden türetilen sınıftaki katman kümesini ve bu sınıftaki belirli bir katmanı ele alan işlevleri ele alan işlevleri yerleştirin. Bunu tek bir sınıfla yapmanın daha iyi bir yolu var mı?

aşağıdaki örnekte iki sınıf yaklaşımı kullanarak, ben

n1 = layers[5].n 

Bu hak, bunu yapmanın en iyi yolu gibi statments kullanarak değişkenleri erişebilmesi şeyler kurmak mümkün değil mi?

#Test passing values to and from functions 

class Layers(list): 

    def add(self,n,k,comment): 
     self.append(OneLayer(n,k,comment)) 

    def input_string(self): 
     input_string = [] 
     for layer in self: 
      vars = layer.input_string() 
      for var in vars: 
       input_string.append(var) 
     return input_string 

    def set_layers(self,results): 
     for layer,i in enumerate(self): 
      j = i*layer.num_var 
      layer.set_layer(*results[j:j+2]) 

class OneLayer(object): 

    def __init__(self,n,k,comment): 
     self.n = n 
     self.k = k 
     self.comment = comment 

    def input_string(self): 
     return [['f','Index of Refraction',self.n], ['f','Absorption',self.k],['s','Comment',self.comment]] 

    def set_layer(self,n,k,comment): 
     self.n = n; self.k=k; self.comment = comment 

    def num_var(self): 
     return 3 

if __name__ == '__main__': 
    layers = Layers() 

    layers.add(1.0,0.0,'This vacuum sucks') 
    layers.add(1.5,0.0,'BK 7 Glass') 

    print layers[0].n 
    print layers.input_string() 
    layers[1].set_layer(1.77,0.0,'Sapphire') 
    print layers.input_string() 

Bu test programı aşağıdaki çıktıyı almak:

1.0 
[['f', 'Index of Refraction', 1.0], ['f', 'Absorption', 0.0], ['s', 'Comment', 'This vacuum sucks'], ['f', 'Index of Refraction', 1.5], ['f', 'Absorption', 0.0], ['s', 'Comment', 'BK 7 Glass']] 
[['f', 'Index of Refraction', 1.0], ['f', 'Absorption', 0.0], ['s', 'Comment', 'This vacuum sucks'], ['f', 'Index of Refraction', 1.77], ['f', 'Absorption', 0.0], ['s', 'Comment', 'Sapphire']] 
+1

geçersiz kılmak için, bu şekilde gerçekten 'list 'dan devralan bir' Layers' sınıfını gerekiyor mu? Bunun yerine sadece bir liste kullanın. –

cevap

9

Kodunuzdaki çeşitli sorunlar vardır:

Eğer herhangi bir liste işlemini yapmak 1.If sonucu bir yerli olacak listesi: Eğer __repr__ geçersiz kılabilir zaman

layers1 = Layers() 
layers2 = Layers() 
layers1 + layers2 -> the result will be a native list 

2.Why input_string tanımlamak ya da 3.Bu durumda bu listeden ne tür bir sonuç almak zorunda kalıyorsunuz? Sınıfınızın tam olarak bir liste gibi davranmasını istiyorsanız sadece listeden türetmeniz gerekir. Ama senin durumunda bir konteynır arıyor gibi görünüyorsun. Eğer sınıf bir listeye benzer davranmaya almak için yapmanız gereken bazı özel piton yöntemleri http://docs.python.org/reference/datamodel.html#emulating-container-types

class Layers(object): 
    def __init__(self, container=None): 
     if container is None: 
      container = [] 
     self.container = container 

    def add(self,n,k,comment): 
     self.container.append([n,k,comment]) 

    def __str__(self): 
     return str(self.container) 

    def __repr__(self): 
     return str(self.container) 

    def __getitem__(self, key): 
     return Layers(self.container[key]) 

    def __len__(self): 
     return len(self.container) 

>>> l = Layers() 
>>> l.add(1, 2, 'test') 
>>> l.add(1, 2, 'test') 
>>> l 
[[1, 2, 'test'], [1, 2, 'test']] 
>>> l[0] 
[1, 2, 'test'] 
>>> len(l) 
2 
+0

@hopatcong: __add__ yöntemini uygulayarak ilk sorunu düzeltebilirsiniz. Http://docs.python.org/reference/datamodel.html#emulating-numeric-types sayfasına bakın. –

+0

Sadece bir ekleme, __repr__ input_string için uygun bir yedek. __str__'nin gayri resmi/basit bir açıklama olması gerekiyor - nesnenin tam bir temsili değil. – monokrome

+1

Ve kodunuzda bir sorun var: değişebilir varsayılan değer, bkz http://stackoverflow.com/q/1132941/13543 –

İlgili konular