2012-05-24 29 views
1

想象我有一个类A继承的输入类的所有活动变量

class A(object): 
    def __init__(self, x, y) 
     self.x = x 
     self.y = y 

,然后我定义一个类BA(而不是采取A作为其基底)和其它参数

初始化
class B(object): 
    def __init__(self, a): 
     if isinstance(a, A): 
      self.a = a 

问题是,假设A有定义的变量,一个巨大的量,并应在B经常被称为是有可能使B知道在A这些变量,从而使B我可以做

self.x 

而不是

self.a.x 

的?

我知道这个变量的自动继承是有点危险,甚至可能是破坏性的,但打字许多额外self.a.x看起来有点笨重。可以选择暂时或以小代码片段打开此继承,这应该很有用。

编辑

__dict__带来了本质上的一切,包括methodsfunctions,可能只保留数值变量?

+0

复制'__dict__'非常接近,但请看看我修改后的问题:宁愿只继承数值变量(数字和数组)。 – nye17

回答

2

你可以写:

class B(object): 
    def __getattr__(self, attr): 
     if hasattr(self.a, attr): 
      return getattr(self.a, attr) 
     else: 
      return object.__getattribute__(self, attr) 

每当你访问的B一个属性,它会检查是否a有属性。如果是这样,它会返回。否则,它将在B本身中查找属性。

+0

虽然其他两个答案可能是最简单和最简单的,但这是迄今为止最灵活的答案。对'a'的更新也会在'b'中自动更新。 – Izkata

+0

我主要想在'B'内使用'a',而不是在'B'之外访问,它是否以这种方式工作? – nye17

+0

是的,因为当你在'B'的方法中写'self.foo'时,Python会调用'__getattr__'来查找属性,这意味着上面的代码将会运行。 –

1

(更新不包括方法):

class B(object): 
    def __init__(self, a, g): 
     if isinstance(a, A): 
      for k,v in a.__dict__.iteritems(): 
       if not callable(v): 
        self.__dict__[k] = v 
1
class B(object): 
    def __init__(self, a): 
     self.__dict__.update(a.__dict__) 

Python中的最佳实践通常不是检查类型为isinstance()而是使用“鸭子打字”。我不知道你在做什么的全部细节,所以我不知道你是否有合法的理由需要isinstance()支票,但我没有写上面的代码。

设置您的B的实例,其实例名与A的实例相同,绑定这些名称的值相同。

+0

感谢您提醒我在鸭子的鸭子打字练习。我在这里使用实例检查,因为在我的源代码中'A'实际上非常具体,我只想在'B'的定义中使用'A' – nye17