2017-12-03 190 views
3

我驚訝於它似乎沒有文件說明如何在Python中將派生類截斷爲基類。 在Python中,Derived類可以截斷爲基類嗎?

實際上,它可能用得較少。但我現在面臨的問題AA:

簡體:

基類

class Base(object): 
    def __init__(self): 
     self.a = 10 

和派生類:

class Derived(Base): 
    def __init__(self): 
     super(Derived, self).__init__() 
     self.b = 10 

現在,在某些情況下,我需要合併數據可能是Derived和Base,而只保留數據字段在Base,所以我需要一個方法來截斷Derived到基地,但我什麼也沒找到。

我試圖在Base和Derived中創建一個get_base方法,並讓它返回基地派生於super(Derived, self).get_base(),但返回的結果仍然是Derived!

我打印基本的__dict__,發現它只有方法,沒有用戶定義的屬性...

我想知道是否存在一種方式來獲得從Derived實例基礎的數據字段(截斷)?

回答

4

我想知道是否存在一個方式來獲得Derived實例(截)基本的數據字段?

實例數據不區分它是由基類還是派生類創建(或更改)。無論來源如何,這些屬性都保存在同一實例字典中。

>>> c = Derived() 
>>> vars(c) 
{'a': 10, 'b': 10} 

這就是說,你可以內省__init __()方法來尋找出他們使用的變量名:

>>> Base.__dict__['__init__'].__code__.co_names 
('a',) 
>>> Derived.__dict__['__init__'].__code__.co_names 
('super', 'Derived', '__init__', 'b') 

如果出發點是實例的混合列表,你可以找出通過將每個實例的內容相交的常見屬性,然後使用常用屬性來查找截短的數據:

instances = [Base(), Derived(), Base(), Derived(), Base()] 
common_attributes = reduce(set.intersection, map(set, map(vars, instances))) 
for inst in instances: 
    print {attr: getattr(inst, attr) for attr in common_attributes} 
+0

哦,太聰明瞭!非常感謝! Python比我想象的更加靈活和複雜。 –

相關問題