2012-03-06 4 views
1

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

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

+0

Вы, вероятно, придется написать свой собственный [копировать] конструктор, который копирует элементы более, если нет какой-то наследство отношения между классами. – prelic

+2

'object1 .__ dict __. Update (object2 .__ dict __)'? –

+2

Всегда стоит спросить, почему вы хотите это сделать? –

ответ

4

Используйте __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)) 
1

Вы можете создать объект, который работает как прокси-сервер - просто вызовите методы и переменные объектов. В 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

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

self.__dict__.update(otherobj.__dict__)

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

2

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

так

vars(self).update(vars(obj)) работает слишком

0
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 
Смежные вопросы