2010-09-29 20 views
9

İki sınıfım var. 2 özellik dışında neredeyse aynıdırlar. Ben birinden diğerine tüm özelliklerini kopyalamak için gerekiyor ve bir desen veya en iyi uygulama, veya temelde tıpkı gerekiyorsa varsa ben sadece merak ediyorum:Python - Bir nesnenin niteliklerini diğerine kopyalamanın doğru yolu nedir?

spam.attribute_one = foo.attribute_one 
spam.attribute_two = foo.attribute_two 

.. . ve bunun gibi.

+3

Neden miras mı kullanmıyorsunuz? – shahjapan

+0

@Tumbleweed - Onlar ORM sınıfları. Birisi veritabanında işlem kaydı tutmak için, ve onlar gibi miras kullanmayı denemek için uzun vadede sadece daha fazla iş var, böyle farklı kullanımları, yöntemleri, vb var (bir tane temizlemek planı ve diğer tutmak için söz değil) sürekli). – orokusaki

cevap

15

Verdiğiniz kod doğru ve güvenlidir; 'un bağlanmaması gereken "yanlışlıkla" bağlantı özelliklerinden kaçınılmalıdır. Eğer güvenlik ve doğruluğu üzerinde otomasyon lehine olsa, sen ... gibi bir şey kullanabilirsiniz:

def blindcopy(objfrom, objto): 
    for n, v in inspect.getmembers(objfrom): 
     setattr(objto, n, v); 

Ancak, ben (bunu tavsiye etmem fıkra ;-) ima nedenlerle. Eğer kopyalamak istediğiniz özelliklerin adlarını biliyor OTOH, aşağıdaki gayet güzel:

def copysome(objfrom, objto, names): 
    for n in names: 
     if hasattr(objfrom, n): 
      v = getattr(objfrom, n) 
      setattr(objto, n, v); 

bir "kamu hizmetleri" modülünde kez bu kodu sahip genellikle böyle şeyleri yaparsanız can senin için kesin bir kazan!

+0

yine teşekkürler. İkinci yönteminizi beğeniyorum ama tavsiyelerinizle ilgileneceğim ve doğru ve güvenli bir şekilde yapacağım. Bir alan adlarına sahip olmak bana çok fazla kod-alan/temizlik vermeyecek. – orokusaki

+2

kör kopya işlevindeki for döngüsü, operatör içi özniteliği özlüyor. – systemovich

3

Benzerler ve durumu değiştirmeleri gerekiyorsa, gerçekten bir sınıf örneğiniz ve bunun nasıl davranacağını belirleyen mode veya benzeri bir öznitelik gibi görünüyor. Nesneler, bir nesneden diğerine, benzer ama ayrı bir nesneden çok sık olmamalıdır.

+0

Sıralama, ancak bunların kullanımı, iki sınıfı garanti etmek için yeterince farklıdır. Ayrıca, onların ORM sınıfları ve bir kayıt tutma içindir. Diğer periyodik olarak temizlenir. – orokusaki

İlgili konular