在Python中,Derived类可以截断为基类吗?

在Python中,Derived类可以截断为基类吗?

问题描述:

我惊讶于它似乎没有文件说明如何在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实例基础的数据字段(截断)?

我想知道是否存在一个方式来获得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比我想象的更加灵活和复杂。 –