Python: объединить два отдельных объекта в один? - PullRequest
1 голос
/ 07 марта 2012

немного странный вопрос здесь.Если у меня есть два отдельных объекта, каждый со своими собственными переменными и функциями, есть ли способ объединить эти два объекта в один отдельный объект?

Если говорить более конкретно: у меня есть объект с 15 переменнымии тогда у меня есть собственный объект.Я хочу загрузить эти переменные в себя.Есть ли простой способ сделать это или я должен сделать это вручную?

Ответы [ 5 ]

4 голосов
/ 07 марта 2012

Используйте свойство __dict__: self.__dict__.update(other.__dict__)

В некоторых случаях это не сработает, особенно для любых переменных, определенных в классе, а не в методе (или в другом «исполняемом коде»).

Если вы хотите скопировать почти все:

for k in filter(lambda k: not k.startswith('_'), dir(other)): # avoid copying private items
    setattr(self, k, getattr(other, k))
2 голосов
/ 07 марта 2012

vars(obj) возвращает obj.__dict__

, поэтому

vars(self).update(vars(obj)) тоже работает

1 голос
/ 07 марта 2012

Вы можете создать объект, который работает как прокси - просто вызовите методы и переменные объектов. В Python вы можете использовать __getattr__() для этого:

class A:
    def __init__(self):
        self.a1 = 1
        self.a2 = 2

    def a(self):
        return "a"

class B:
    def __init__(self):
        self.b1 = 1
        self.b2 = 2

    def b(self):
        return "b"

class Combine:
    def __init__(self, *args):
        self.__objects = args

    def __getattr__(self, name):
        for obj in self.__objects:
            try:
                return getattr(obj, name)
            except AttributeError:
                pass

        raise AttributeError

obj = Combine(A(), B())

print obj.a1, obj.a2, obj.a()
print obj.b1, obj.b2, obj.b()
0 голосов
/ 07 марта 2012
for k,v in other.__dict__.items():
    # you might want to put other conditions here to check which attrs you want to copy and which you don't
    if k not in self.__dict__.keys():
        self.__dict__[k]=v
0 голосов
/ 07 марта 2012

быстрый, но безобразный (и небезопасный) способ копирования элементов сразу из другого объекта:

self.__dict__.update(otherobj.__dict__)

однако это не будет копировать методы и статические (классовые) члены.

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