【问题标题】:Is it possible to do partial inheritance with Python?是否可以使用 Python 进行部分继承?
【发布时间】:2011-08-04 13:31:50
【问题描述】:

我正在 Python 中创建一个类 (class0),它当前基于一个类 (class1);但是,我也想从另一个类(class2)继承。关于 class2 的事情是我不想要它的所有方法和属性,我只需要一个方法。 class0 是否可以仅从 class2 继承单个方法?

【问题讨论】:

    标签: python class inheritance


    【解决方案1】:

    在这种情况下,让另一个类实现您想要的方法的“mixin”方法是正确的做法。 但是为了完整起见,因为它准确地回答了您的要求,所以我补充说,是的,可以有一种行为,就像您想要的“部分继承”一样(但请注意,这样的概念并不正式存在)。

    只需在新类上添加成员,这些成员引用您希望在其中重复的方法或属性:

    class Class2(object):
       def method(self):
          print ("I am method at %s" % self.__class__)
    
    class Class1(object):
       pass
    
    class Class0(Class1):
       method = Class2.__dict__["method"]
    
    ob = Class0()
    ob.method()
    

    请注意,在 Python 2.x(最高 2.7)中需要从 __dict__ 类中检索方法 - 因为为了在方法中转换函数而进行了运行时转换。在 Python 3.0 及以上版本中,只需更改行

    method = Class2.__dict__["method"]
    

    method = Class2.method
    

    【讨论】:

      【解决方案2】:

      一种方法是使用“混合”方法:

      class Mixin(object):
          def method(self):
              pass
      
      class C1(Mixin, ...parents...):
          pass
      
      class C2(Mixin, ...parents...):
          pass
      

      另一种方式是组合:

      class C1(object):
          def method(self):
              pass
      
      class C2(object):
          def __init__(self):
              self.c1 = C1()
      
          def method(self):
              return self.c1.method()
      

      【讨论】:

      • 在 Python 中,第一个不会被称为 Mixin,而只是一个基类……
      • 电影人,我不这么认为。本例中将首先调用 Mixin 的方法,并将 method 方法隐藏在任何其他父级中。
      【解决方案3】:

      你为什么不使用合成呢?让您的班级保留对所需对象的引用,并委托给它。

      【讨论】:

      • 并且必须传递他希望此方法通过参数访问的任何属性。他还不如根本不用方法,只用一个函数。
      • 如果是这种情况,可以只在主对象上设置属性并从其他类调用未绑定方法。然而,这听起来更像是算法的类型不可知的实现,作为两个类作为方法带入其本地命名空间的顶级函数。
      【解决方案4】:

      创建另一个实现这个方法的基类,并使class2和class1都继承这个类

      【讨论】:

        猜你喜欢
        • 2016-11-19
        • 2020-05-30
        • 2010-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-15
        • 2019-01-26
        • 1970-01-01
        相关资源
        最近更新 更多