2012-05-24 28 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