2010-09-29 20 views
9

Mam dwie klasy. Są prawie identyczne, z wyjątkiem 2 atrybutów. Muszę skopiować wszystkie atrybuty w ciągu od jednego do drugiego, a ja po prostu zastanawiasz czy istnieje wzór lub najlepsze praktyki, lub jeśli mam po prostu w zasadzie zrobić:Python - jaki jest właściwy sposób kopiowania atrybutów obiektu do innego?

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

.. . i tak dalej.

+3

dlaczego nie używasz dziedziczenia? – shahjapan

+0

@ Tumbleweed - Są to klasy ORM. Jedną z nich jest przechowywanie rekordów transakcji w bazie danych i mają one tak różne zastosowania, metody itp., Że w dłuższej perspektywie jest to po prostu więcej pracy, aby spróbować użyć dziedziczenia (nie wspominając o tym, że planuję wyczyścić jedno i zachować drugie na stałe). – orokusaki

Odpowiedz

15

Podany przez Ciebie kod jest poprawny i bezpieczny, unikając "przypadkowego" powiązania atrybutów, które powinny być powiązane z , a nie. Jeśli wolisz automatyzację nad bezpieczeństwem i poprawności, choć ty mógłby użyć czegoś jak ...:

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

Jednak nie polecam go (z powodów implikowanych przez akapit pierwszy ;-). OTOH, jeśli znasz nazwy atrybutów, które chcesz skopiować, po to dobrze:

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

Jeśli robisz takie rzeczy często, mając ten kod raz w „utilities” moduł może bądź pewny wygranej!

+0

dzięki jeszcze raz. W pewnym sensie lubię twoją drugą metodę, ale będę trzymać się twojej rady i zrobić to w prawidłowy i bezpieczny sposób. Posiadanie krotki nazw pól nie oszczędzi mi wiele przestrzeni kodu/czystości. – orokusaki

+2

pętla for w funkcji blindcopy pomija operatorowi. – systemovich

3

Jeśli są one podobne i trzeba zmienić stan, wydaje się, że rzeczywiście istnieją instancje jednej klasy i mode lub podobny atrybut, który określa sposób działania. Obiekty nie powinny przekształcać się z jednego obiektu na inny, podobnie jak bardzo często oddzielnie.

+0

Sortowanie, ale ich użycie jest wystarczająco różne, aby zagwarantować dwie klasy. Również ich klasy ORM, a jedna służy do przechowywania danych. Drugi będzie okresowo oczyszczany. – orokusaki

Powiązane problemy