【问题标题】:Calling similar named functions in subclasses from superclass从超类调用子类中类似的命名函数
【发布时间】:2018-03-16 15:46:35
【问题描述】:

this question 的后续行动,其表述不是很好。答案提供了一些额外的见解,所以现在我构建了一个有限的工作示例来更好地解释它。

基本上我们有两个子类AB 以及一个继承自两者的类CAB 类都有一个函数 MyFunc,但它们的作用不同。

我希望C 类能够使用这两个函数并完全控制调用哪个函数,因为我希望对每个函数做不同的事情。下面有限工作示例中的注释显示了我正在尝试做的事情。

    class A():
        def __init__(self, var1, var2):
            self.var1 = var1
            self.var2 = var2
        def MyFunc(self):
            result = self.var1 + self.var2
            return result
    
    class B():
        def __init__(self, var1):
            self.var1 = var1
        def MyFunc(self):
            result = self.var1**2
            return result
    
    class C(A,B):
        def __init__(self, var1, var2, var3):
            A.__init__(self, var1, var2)
            B.__init__(self, var3)
        def MyFunc(self):
            #in this function I want to call MyFunc from A and MyFunc from B. For example to add their results together

如何在A 中调用MyFuncB 中的MyFuncMyFunc 中的C

【问题讨论】:

    标签: python class oop


    【解决方案1】:

    您可以使用名称修饰使某个类的属性在子类中可用,即使该子类定义了具有相同名称的属性。

    class A():
        def __init__(self, var1, var2):
            self.var1 = var1
            self.var2 = var2
        def __MyFunc(self):
            result = self.var1 + self.var2
            return result
        MyFunc = __MyFunc
    
    class B():
        def __init__(self, var1):
            self.var1 = var1
        def __MyFunc(self):
            result = self.var1**2
            return result
        MyFunc = __MyFunc
    
    class C(A,B):
        def __init__(self, var1, var2, var3):
            A.__init__(self, var1, var2)
            B.__init__(self, var3)
        def MyFunc(self):
            return self._A__MyFunc() + self._B__MyFunc()
    
    c = C(1, 2, 3)
    print(c.MyFunc())
    # 14
    

    【讨论】:

    • 看起来不错,但为什么结果是 14?不应该是12吗? 1+2+3**2 = 12
    • c 有两个 var 属性 var1var2var13var22。你明白为什么吗?
    • 不是真的....我认为 C 的 init 方法应该解决这个问题并给出c var1 = 1、var2 = 2 和 var3 = 3。我在这里错过了什么?
    • 您的所有类都没有定义self.var3。所以CA 得到var1var2。然后它从B 获得var1,它覆盖了从A 获得的var1。这是给事物起描述性名称很重要的原因之一。
    • A.__init__(self, var1, var2) 在这种情况下会做什么?它是否将C 类传递到A?我很困惑
    【解决方案2】:

    我尝试使用您的示例建议使解决方案看起来尽可能简单。

        def MyFunc(self):
            result = 0
            result += A.MyFunc(self=self)
            result += B.MyFunc(self=self)
            return result
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 2013-10-20
      相关资源
      最近更新 更多