2010-01-28 32 views
26

türünde class A türünde bir nesneye sahip olduğumuzu varsayalım. İkinci bir class B(A) tanımladık. Nesne k nesnesini class B'a dönüştürmek ve k'daki tüm verileri korumak için en iyi uygulama nedir?Python nesne dönüşümü

+2

Hangi yolla birinden diğerine dönüştürmeyi düşünüyorsunuz? Sınıf B nesnesinin tüm üye değişkenlerini tutmak istiyor musunuz, ancak A sınıfı sınıflar yöntemini kullanın? – BrainCore

+3

Bu Pretty Poor Polimorfizm mi? Ortak bir süper sınıfın A ve B alt sınıfları mı? Eğer öyleyse, bu yanlış bir şey mi? A'nın B ile aynı yöntemlere sahip olmasını ister misiniz? Bu çoklu kalıtım yoluyla yapılır. Lütfen neden buna ihtiyacınız olduğunu düşündüğünüzü açıklayın, çünkü - Python'da - dönüşüm veya döküm işlemine ihtiyacınız olduğunu düşünüyorsanız, yanlış yapıyorsunuz demektir. –

+0

Ayrıca kullanım durumunuzu gerçekten merak ediyorum. Bu sadece eğlenmek için mi, yoksa klasik polimorfizmden başka bir problemle karşılaşmanın daha iyi bir yolu olduğunu mu buldunuz? –

cevap

17

Bu "sınıf dönüşümü" yapar ama tali hasar tabidir. Başka bir nesne oluşturmak ve BrainCore'un yayınladığı __dict__'u değiştirmek daha güvenli olacaktır - ancak bu kod, yeni bir nesne oluşturulmadan istediklerinizi yapar.

class A(object): 
    pass 

class B(A): 
    def __add__(self, other): 
     return self.value + other 


a = A() 
a.value = 5 

a.__class__ = B 

print a + 10 
7
a = A() # parent class 
b = B() # subclass 
b.value = 3 # random setting of values 

a.__dict__ = b.__dict__ # give object a b's values 

# now proceed to use object a 

Bu kullanım durumunuzu tatmin eder miydi? Not: Sadece b'nin örnek değişkenlerine, class B sınıfı değişkenleri değil, a nesnesinden erişilebilir. Eğer bir deepcopy yapmadıkça Ayrıca, içinde modifiye değişkenler, b değişkeni değiştirir:

import copy 
a.__dict__ = copy.deepcopy(b.__dict__) 
+1

Aslında, hiçbir değişken kopyalanmayacak. 'A' ve' b' artık her ikisi de aynı '__dict__' paylaştığından,' a.value 'değerini ayarlamak' b.value' da değiştirir. –

+0

Haklısın, düzeltildin, teşekkürler. – BrainCore

+0

Aslında bunu yaparken, "bir" nesne hemen imha edilmelidir. Öte yandan, aynı öznitelikleri paylaşan farklı sınıflardaki iki farklı nesne ile sonuçlanır - bundan daha az kötü senaryo vardır. (Etkileşimli komutta bile oynamak korkutucu) – jsbueno