Python - как правильно скопировать атрибуты объекта в другой? - PullRequest
9 голосов
/ 29 сентября 2010

У меня есть два класса.Они почти идентичны, за исключением 2 атрибутов.Мне нужно скопировать все атрибуты из одного в другое, и мне просто интересно , есть ли шаблон или лучшая практика, или , если мне просто нужно сделать:

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

... и т. Д.

Ответы [ 2 ]

15 голосов
/ 29 сентября 2010

Код, который вы даете, является правильным и безопасным, избегая «случайных» обязательных атрибутов, которые должны быть связаны , а не .Однако если вы предпочитаете автоматизацию, а не безопасность и правильность, вы могли бы использовать что-то вроде ...:

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

Однако я бы не рекомендовал это (по причинам, указанным в первомпункт ;-).OTOH, если вы знаете имена атрибутов, которые вы хотите скопировать, то все в порядке:

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

Если вы делаете такие вещи часто, имея этот код один раз вмодуль "утилиты" может быть для вас определенной победой!

3 голосов
/ 29 сентября 2010

Если они очень похожи и нуждаются в изменении состояния, похоже, у вас действительно есть экземпляры одного класса и атрибут mode или аналогичный, который определяет его поведение.Объекты не должны превращаться из одного объекта в другой, похожий, но отдельный объект, очень часто вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...