【问题标题】:Python: Inherit/reuse specific methods from classesPython:从类继承/重用特定方法
【发布时间】:2013-08-24 12:39:42
【问题描述】:

我想要一个 python 类,它部分由来自其他类的特定方法组成,这些方法在“组合类”中的 self 上运行。我该怎么做?

例如如果我想在我的新类“theClass”中包含来自 classA 和 classB 的特定方法:

    # Some classes to "inherit" from
    class classA(object):
        def methA1(self, value):
            self.attrib = value*1
        def methA2(self, value):
            self.attrib = value*2
    class classB(object):
        def methB1(self, value):
            self.attrib = value*3
        def methB2(self, value):
            self.attrib = value*4

    # The class I want to build
    class theClass(object):
        # WHAT TO DO HERE?
        # -------------------
        methA1 = classA.methA1
        methB2 = classB.methB2
        # -------------------
        # /WHAT TO DO HERE

        # add additional methods...
        def methC(self, value):
            self.attrib = value*5

    # I want the following behavior
    instance = theClass()
    instance.methB2(5)  # sets instance.attrib to 20
    instance.methA2(5)  # error, does not exist

【问题讨论】:

  • 这应该可以工作,至少在 Python 3 中。你的问题/问题是什么?
  • @AshwiniChaudhary 这并没有给出关于methA2methB1 的预期行为。
  • @delnan 哦!没看到这条线:# error, does not exist

标签: python class inheritance methods code-reuse


【解决方案1】:

你可以使用 mixins:

class MixinA1(object):
    def methA1(self, value):
        self.attrib = value*1
class MixinB2(object):       
    def methB2(self, value):
        self.attrib = value*4
class classA(MixinA1):
    def methA2(self, value):
        self.attrib = value*2
class classB(MixinB2):
    def methB1(self, value):
        self.attrib = value*3

# The class I want to build
class theClass(MixinA1, MixinB2):
    def methC(self, value):
        self.attrib = value*5

如果 Mixin 类封装了一些您希望添加到多个类的功能单元,那么 Mixin 是有意义的。

如果方法不能自然地分解为功能单元, 这是另一种选择:

def methA1(self, value):
    self.attrib = value*1
def methA2(self, value):
    self.attrib = value*2
def methB2(self, value):
    self.attrib = value*4
def methB1(self, value):
    self.attrib = value*3
def methC(self, value):
    self.attrib = value*5

class classA(object):
    methA1 = methA1
    methA2 = methA2    
class classB(object):
    methB1 = methB1
    methB2 = methB2        
class theClass(object):
    methA1 = methA1
    methB2 = methB2
    methC = methC

这与您已经发布的替代方法非常相似,不同之处在于它将所有类置于平等地位——最初这些方法不与任何特定类相关联。这可能更可取,因此theClass 不会通过进入并从它不明确依赖的类(例如classA)中获取方法来“破坏封装”。

【讨论】:

  • 谢谢。我不喜欢 mixins 的一点是,它们并没有特别清楚地说明“新”类中有哪些方法可用。如果你有“self.thisMethod = classA.thisMethod”,你就知道它是可用的。我有大约 15 种方法需要在大约 10 个其他类中以不同的方式导入。但可能没有办法?
猜你喜欢
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 2015-02-15
  • 2011-10-05
  • 1970-01-01
  • 2019-03-16
  • 2018-02-04
  • 2020-06-27
相关资源
最近更新 更多