2012-03-06 92 views
1

这里有点奇怪的问题。如果我有两个单独的对象,每个都有自己的变量和函数,那么这两个对象可以组合成一个单独的对象吗?Python:将两个独立的对象合并为一个?

更具体一点:我有一个有15个变量的对象,然后我有自己的对象。我想将这些变量加载到自身中。有没有简单的方法来做到这一点,或者我必须手动做到这一点?

+0

你可能必须写你自己的[复制]构造函数,拷贝了成员,除非有某种继承类之间的关系。 – prelic 2012-03-06 20:37:39

+2

'object1 .__ dict __。update(object2 .__ dict __)'? – 2012-03-06 20:42:36

+2

总是值得一问,你为什么要这样做? – 2012-03-06 21:06:16

回答

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