Python3,OOP:多个类继承到单个类

时间:2016-07-25 11:20:06

标签: python oop

我将多个父类继承到一个类中。我想要做的是使对象数据冲突的情况。

我的意思是,如果两个类包含一个具有相同名称和不同数据的变量,那么如果该变量出现在图片中,哪些数据将由Python加载?

我做了什么

>>> class pac:
...  var=10
...  var2=20
... 
>>> class cac:
...  var3=30
...  var2=10
... 

>>> pob=pac()
>>> cob=cac()
>>> pob.var
10
>>> pob.var2
20
>>> cob.var2
10
>>> cob.var3
30
>>> class newclass(pac,cac):
...  def sum(self):
...   sum=self.var+self.var2
...   sum2=self.var2+self.var3
...   print(sum)
...   print(sum2)
... 
30
50
>>> nob.var
10
>>> nob.var2
20
>>> nob.var3
30
>>> 

似乎var2数据会从父类中考虑:pac而不是cac类。

如果相同的变量名存在不同的数据,那么需要做些什么才能让Python考虑来自cac而不是pac的数据?请不要建议我改变继承顺序。

谢谢。

3 个答案:

答案 0 :(得分:2)

在不改变继承顺序的情况下,您的子类将始终从第一个类中获取它可以在第一个类中找到的属性。如果你想知道第二堂课的相应价值是什么,你就必须明确要求第二堂课的价值。

在你的情况下,像

class newclass(pac,cac):
    @property
    def var2(self):
        return cac.var2

请注意,我明确要求cac< var 2。

答案 1 :(得分:2)

您可以在newclass的 init 方法中设置self.var2 = cac.var2:

class newclass(pac, cac):
    def __init__(self):
        self.var2 = cac.var2

答案 2 :(得分:1)

您还可以使用以下代码返回可能值的列表/元组:

@property
    def var2(self):
        key='var2'
        return [getattr(c,key) for c in self.__class__.mro()[1:-1] if hasattr(c,key)]

mro方法返回一个类列表,第一个是调用者类,后面是父类,最后是object内置类。 此代码将按继承顺序返回值列表。